]> git.openfabrics.org - ~shefty/rdma-dev.git/commitdiff
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/sameo/mfd-2.6
authorLinus Torvalds <torvalds@linux-foundation.org>
Tue, 4 Aug 2009 22:29:25 +0000 (15:29 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Tue, 4 Aug 2009 22:29:25 +0000 (15:29 -0700)
* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/sameo/mfd-2.6:
  mfd: twl4030 irq fixes

26 files changed:
arch/x86/include/asm/efi.h
arch/x86/include/asm/irqflags.h
arch/x86/include/asm/uv/uv_hub.h
arch/x86/kernel/apic/io_apic.c
arch/x86/kernel/apic/x2apic_cluster.c
arch/x86/kernel/apic/x2apic_phys.c
arch/x86/kernel/apic/x2apic_uv_x.c
arch/x86/kernel/apm_32.c
arch/x86/kernel/efi.c
arch/x86/kernel/efi_64.c
arch/x86/kernel/head_32.S
arch/x86/kernel/reboot.c
arch/x86/kernel/vmlinux.lds.S
arch/x86/lib/msr.c
arch/x86/mm/pageattr.c
arch/x86/mm/pgtable.c
drivers/cpufreq/cpufreq.c
drivers/cpufreq/cpufreq_conservative.c
fs/cifs/CHANGES
fs/cifs/README
fs/cifs/cifs_dfs_ref.c
fs/cifs/cifs_unicode.c
fs/cifs/cifsfs.c
fs/cifs/connect.c
fs/nilfs2/mdt.c
fs/nilfs2/segment.c

index edc90f23e70814a80491b45db2409656c1b35be4..8406ed7f99269f97c469bc9b03e0cb8d00276f84 100644 (file)
@@ -33,7 +33,7 @@ extern unsigned long asmlinkage efi_call_phys(void *, ...);
 #define efi_call_virt6(f, a1, a2, a3, a4, a5, a6)      \
        efi_call_virt(f, a1, a2, a3, a4, a5, a6)
 
-#define efi_ioremap(addr, size)                        ioremap_cache(addr, size)
+#define efi_ioremap(addr, size, type)          ioremap_cache(addr, size)
 
 #else /* !CONFIG_X86_32 */
 
@@ -84,7 +84,8 @@ extern u64 efi_call6(void *fp, u64 arg1, u64 arg2, u64 arg3,
        efi_call6((void *)(efi.systab->runtime->f), (u64)(a1), (u64)(a2), \
                  (u64)(a3), (u64)(a4), (u64)(a5), (u64)(a6))
 
-extern void __iomem *efi_ioremap(unsigned long addr, unsigned long size);
+extern void __iomem *efi_ioremap(unsigned long addr, unsigned long size,
+                                u32 type);
 
 #endif /* CONFIG_X86_32 */
 
index 2bdab21f0898dedee3ad1bf495b73b7ae0d3f997..c6ccbe7e81ad21731b251c5ce9e9bf5bd0c64116 100644 (file)
@@ -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");
 
index 341070f7ad5cb62679f22f7b3fff7316c549b5d9..77a68505419a5e3a8c7a0c2a7ae6f43b34f32541 100644 (file)
@@ -175,7 +175,7 @@ DECLARE_PER_CPU(struct uv_hub_info_s, __uv_hub_info);
 #define UV_GLOBAL_MMR32_PNODE_BITS(p)  ((p) << (UV_GLOBAL_MMR32_PNODE_SHIFT))
 
 #define UV_GLOBAL_MMR64_PNODE_BITS(p)                                  \
-       ((unsigned long)(UV_PNODE_TO_GNODE(p)) << UV_GLOBAL_MMR64_PNODE_SHIFT)
+       (((unsigned long)(p)) << UV_GLOBAL_MMR64_PNODE_SHIFT)
 
 #define UV_APIC_PNODE_SHIFT    6
 
@@ -327,6 +327,7 @@ struct uv_blade_info {
        unsigned short  nr_possible_cpus;
        unsigned short  nr_online_cpus;
        unsigned short  pnode;
+       short           memory_nid;
 };
 extern struct uv_blade_info *uv_blade_info;
 extern short *uv_node_to_blade;
@@ -363,6 +364,12 @@ static inline int uv_blade_to_pnode(int bid)
        return uv_blade_info[bid].pnode;
 }
 
+/* Nid of memory node on blade. -1 if no blade-local memory */
+static inline int uv_blade_to_memory_nid(int bid)
+{
+       return uv_blade_info[bid].memory_nid;
+}
+
 /* Determine the number of possible cpus on a blade */
 static inline int uv_blade_nr_possible_cpus(int bid)
 {
index 2284a4812b68cfb83ab987388d058004ccb5ee55..d2ed6c5ddc80bcb9697079eaa48c79a01b7d48d8 100644 (file)
@@ -3793,6 +3793,9 @@ int arch_enable_uv_irq(char *irq_name, unsigned int irq, int cpu, int mmr_blade,
        mmr_pnode = uv_blade_to_pnode(mmr_blade);
        uv_write_global_mmr64(mmr_pnode, mmr_offset, mmr_value);
 
+       if (cfg->move_in_progress)
+               send_cleanup_vector(cfg);
+
        return irq;
 }
 
index 8e4cbb255c38d289f78083828845da5ae43b06ac..2ed4e2bb3b3223b687b5d7f8f99bc65076674ba2 100644 (file)
@@ -170,7 +170,7 @@ static unsigned long set_apic_id(unsigned int id)
 
 static int x2apic_cluster_phys_pkg_id(int initial_apicid, int index_msb)
 {
-       return current_cpu_data.initial_apicid >> index_msb;
+       return initial_apicid >> index_msb;
 }
 
 static void x2apic_send_IPI_self(int vector)
index a284359627e7fe23ed8a84ab00be47e0a24ae9bf..0b631c6a2e00fdae492100a500886c70a34a3492 100644 (file)
@@ -162,7 +162,7 @@ static unsigned long set_apic_id(unsigned int id)
 
 static int x2apic_phys_pkg_id(int initial_apicid, int index_msb)
 {
-       return current_cpu_data.initial_apicid >> index_msb;
+       return initial_apicid >> index_msb;
 }
 
 static void x2apic_send_IPI_self(int vector)
index 096d19aea2f7180b40be33870a0225ac822f71d3..832e908adcb55fcba7a42614ab09dcf2b782abe1 100644 (file)
@@ -261,7 +261,7 @@ struct apic apic_x2apic_uv_x = {
        .apic_id_registered             = uv_apic_id_registered,
 
        .irq_delivery_mode              = dest_Fixed,
-       .irq_dest_mode                  = 1, /* logical */
+       .irq_dest_mode                  = 0, /* physical */
 
        .target_cpus                    = uv_target_cpus,
        .disable_esr                    = 0,
@@ -362,12 +362,6 @@ static __init void get_lowmem_redirect(unsigned long *base, unsigned long *size)
        BUG();
 }
 
-static __init void map_low_mmrs(void)
-{
-       init_extra_mapping_uc(UV_GLOBAL_MMR32_BASE, UV_GLOBAL_MMR32_SIZE);
-       init_extra_mapping_uc(UV_LOCAL_MMR_BASE, UV_LOCAL_MMR_SIZE);
-}
-
 enum map_type {map_wb, map_uc};
 
 static __init void map_high(char *id, unsigned long base, int shift,
@@ -395,26 +389,6 @@ static __init void map_gru_high(int max_pnode)
                map_high("GRU", gru.s.base, shift, max_pnode, map_wb);
 }
 
-static __init void map_config_high(int max_pnode)
-{
-       union uvh_rh_gam_cfg_overlay_config_mmr_u cfg;
-       int shift = UVH_RH_GAM_CFG_OVERLAY_CONFIG_MMR_BASE_SHFT;
-
-       cfg.v = uv_read_local_mmr(UVH_RH_GAM_CFG_OVERLAY_CONFIG_MMR);
-       if (cfg.s.enable)
-               map_high("CONFIG", cfg.s.base, shift, max_pnode, map_uc);
-}
-
-static __init void map_mmr_high(int max_pnode)
-{
-       union uvh_rh_gam_mmr_overlay_config_mmr_u mmr;
-       int shift = UVH_RH_GAM_MMR_OVERLAY_CONFIG_MMR_BASE_SHFT;
-
-       mmr.v = uv_read_local_mmr(UVH_RH_GAM_MMR_OVERLAY_CONFIG_MMR);
-       if (mmr.s.enable)
-               map_high("MMR", mmr.s.base, shift, max_pnode, map_uc);
-}
-
 static __init void map_mmioh_high(int max_pnode)
 {
        union uvh_rh_gam_mmioh_overlay_config_mmr_u mmioh;
@@ -566,8 +540,6 @@ void __init uv_system_init(void)
        unsigned long mmr_base, present, paddr;
        unsigned short pnode_mask;
 
-       map_low_mmrs();
-
        m_n_config.v = uv_read_local_mmr(UVH_SI_ADDR_MAP_CONFIG);
        m_val = m_n_config.s.m_skt;
        n_val = m_n_config.s.n_skt;
@@ -591,6 +563,8 @@ void __init uv_system_init(void)
        bytes = sizeof(struct uv_blade_info) * uv_num_possible_blades();
        uv_blade_info = kmalloc(bytes, GFP_KERNEL);
        BUG_ON(!uv_blade_info);
+       for (blade = 0; blade < uv_num_possible_blades(); blade++)
+               uv_blade_info[blade].memory_nid = -1;
 
        get_lowmem_redirect(&lowmem_redir_base, &lowmem_redir_size);
 
@@ -629,6 +603,9 @@ void __init uv_system_init(void)
                lcpu = uv_blade_info[blade].nr_possible_cpus;
                uv_blade_info[blade].nr_possible_cpus++;
 
+               /* Any node on the blade, else will contain -1. */
+               uv_blade_info[blade].memory_nid = nid;
+
                uv_cpu_hub_info(cpu)->lowmem_remap_base = lowmem_redir_base;
                uv_cpu_hub_info(cpu)->lowmem_remap_top = lowmem_redir_size;
                uv_cpu_hub_info(cpu)->m_val = m_val;
@@ -662,11 +639,10 @@ void __init uv_system_init(void)
                pnode = (paddr >> m_val) & pnode_mask;
                blade = boot_pnode_to_blade(pnode);
                uv_node_to_blade[nid] = blade;
+               max_pnode = max(pnode, max_pnode);
        }
 
        map_gru_high(max_pnode);
-       map_mmr_high(max_pnode);
-       map_config_high(max_pnode);
        map_mmioh_high(max_pnode);
 
        uv_cpu_init();
index 79302e9a33a43322eea70cc2f69f019426b69847..442b5508893f35b185d0cbd8056d03f8b8aa70c0 100644 (file)
@@ -811,7 +811,7 @@ static int apm_do_idle(void)
        u8 ret = 0;
        int idled = 0;
        int polling;
-       int err;
+       int err = 0;
 
        polling = !!(current_thread_info()->status & TS_POLLING);
        if (polling) {
index 96f7ac0bbf01e567ebf4082ec15b73b9de7a9d2d..19ccf6d0dccf51ea5e90ce16f229d530b057a0d5 100644 (file)
@@ -512,7 +512,7 @@ void __init efi_enter_virtual_mode(void)
                        && end_pfn <= max_pfn_mapped))
                        va = __va(md->phys_addr);
                else
-                       va = efi_ioremap(md->phys_addr, size);
+                       va = efi_ioremap(md->phys_addr, size, md->type);
 
                md->virt_addr = (u64) (unsigned long) va;
 
index 22c3b7828c50fa1f0c61e17d6680cbf19d0b6a17..ac0621a7ac3d23383ed6f284451c5bb7d960f977 100644 (file)
@@ -98,10 +98,14 @@ void __init efi_call_phys_epilog(void)
        early_runtime_code_mapping_set_exec(0);
 }
 
-void __iomem *__init efi_ioremap(unsigned long phys_addr, unsigned long size)
+void __iomem *__init efi_ioremap(unsigned long phys_addr, unsigned long size,
+                                u32 type)
 {
        unsigned long last_map_pfn;
 
+       if (type == EFI_MEMORY_MAPPED_IO)
+               return ioremap(phys_addr, size);
+
        last_map_pfn = init_memory_mapping(phys_addr, phys_addr + size);
        if ((last_map_pfn << PAGE_SHIFT) < phys_addr + size)
                return NULL;
index 8663afb5653547905ecc31bc0ec1d0c41cea2307..0d98a01cbdb2eff6244f4cf938f0457cd145010b 100644 (file)
@@ -602,7 +602,11 @@ ignore_int:
 #endif
        iret
 
-.section .cpuinit.data,"wa"
+#ifndef CONFIG_HOTPLUG_CPU
+       __CPUINITDATA
+#else
+       __REFDATA
+#endif
 .align 4
 ENTRY(initial_code)
        .long i386_start_kernel
index 508e982dd072404d14005a90a8c007682e10fb89..834c9da8bf9dae8a0c57eda519d03c3e29307794 100644 (file)
@@ -3,6 +3,7 @@
 #include <linux/init.h>
 #include <linux/pm.h>
 #include <linux/efi.h>
+#include <linux/dmi.h>
 #include <acpi/reboot.h>
 #include <asm/io.h>
 #include <asm/apic.h>
@@ -17,7 +18,6 @@
 #include <asm/cpu.h>
 
 #ifdef CONFIG_X86_32
-# include <linux/dmi.h>
 # include <linux/ctype.h>
 # include <linux/mc146818rtc.h>
 #else
@@ -404,6 +404,38 @@ EXPORT_SYMBOL(machine_real_restart);
 
 #endif /* CONFIG_X86_32 */
 
+/*
+ * Apple MacBook5,2 (2009 MacBook) needs reboot=p
+ */
+static int __init set_pci_reboot(const struct dmi_system_id *d)
+{
+       if (reboot_type != BOOT_CF9) {
+               reboot_type = BOOT_CF9;
+               printk(KERN_INFO "%s series board detected. "
+                      "Selecting PCI-method for reboots.\n", d->ident);
+       }
+       return 0;
+}
+
+static struct dmi_system_id __initdata pci_reboot_dmi_table[] = {
+       {       /* Handle problems with rebooting on Apple MacBook5,2 */
+               .callback = set_pci_reboot,
+               .ident = "Apple MacBook",
+               .matches = {
+                       DMI_MATCH(DMI_SYS_VENDOR, "Apple Inc."),
+                       DMI_MATCH(DMI_PRODUCT_NAME, "MacBook5,2"),
+               },
+       },
+       { }
+};
+
+static int __init pci_reboot_init(void)
+{
+       dmi_check_system(pci_reboot_dmi_table);
+       return 0;
+}
+core_initcall(pci_reboot_init);
+
 static inline void kb_wait(void)
 {
        int i;
index 59f31d2dd43567f6c995ccf322f666148cc7fb39..78d185d797de7d3862a79adcab4a157613550ba9 100644 (file)
@@ -393,8 +393,8 @@ SECTIONS
 
 
 #ifdef CONFIG_X86_32
-ASSERT((_end - LOAD_OFFSET <= KERNEL_IMAGE_SIZE),
-        "kernel image bigger than KERNEL_IMAGE_SIZE")
+. = ASSERT((_end - LOAD_OFFSET <= KERNEL_IMAGE_SIZE),
+          "kernel image bigger than KERNEL_IMAGE_SIZE");
 #else
 /*
  * Per-cpu symbols which need to be offset from __per_cpu_load
@@ -407,12 +407,12 @@ INIT_PER_CPU(irq_stack_union);
 /*
  * Build-time check on the image size:
  */
-ASSERT((_end - _text <= KERNEL_IMAGE_SIZE),
-       "kernel image bigger than KERNEL_IMAGE_SIZE")
+. = ASSERT((_end - _text <= KERNEL_IMAGE_SIZE),
+          "kernel image bigger than KERNEL_IMAGE_SIZE");
 
 #ifdef CONFIG_SMP
-ASSERT((per_cpu__irq_stack_union == 0),
-        "irq_stack_union is not at start of per-cpu area");
+. = ASSERT((per_cpu__irq_stack_union == 0),
+           "irq_stack_union is not at start of per-cpu area");
 #endif
 
 #endif /* CONFIG_X86_32 */
@@ -420,7 +420,7 @@ ASSERT((per_cpu__irq_stack_union == 0),
 #ifdef CONFIG_KEXEC
 #include <asm/kexec.h>
 
-ASSERT(kexec_control_code_size <= KEXEC_CONTROL_CODE_MAX_SIZE,
-       "kexec control code size is too big")
+. = ASSERT(kexec_control_code_size <= KEXEC_CONTROL_CODE_MAX_SIZE,
+           "kexec control code size is too big");
 #endif
 
index 1440b9c0547e9bd668a7bedf683686c57f5d1db0..caa24aca8115707be495a026fe89f20baea5164a 100644 (file)
@@ -89,16 +89,13 @@ void rdmsr_on_cpus(const cpumask_t *mask, u32 msr_no, struct msr *msrs)
        rv.msrs   = msrs;
        rv.msr_no = msr_no;
 
-       preempt_disable();
-       /*
-        * FIXME: handle the CPU we're executing on separately for now until
-        * smp_call_function_many has been fixed to not skip it.
-        */
-       this_cpu = raw_smp_processor_id();
-       smp_call_function_single(this_cpu, __rdmsr_on_cpu, &rv, 1);
+       this_cpu = get_cpu();
+
+       if (cpumask_test_cpu(this_cpu, mask))
+               __rdmsr_on_cpu(&rv);
 
        smp_call_function_many(mask, __rdmsr_on_cpu, &rv, 1);
-       preempt_enable();
+       put_cpu();
 }
 EXPORT_SYMBOL(rdmsr_on_cpus);
 
@@ -121,16 +118,13 @@ void wrmsr_on_cpus(const cpumask_t *mask, u32 msr_no, struct msr *msrs)
        rv.msrs   = msrs;
        rv.msr_no = msr_no;
 
-       preempt_disable();
-       /*
-        * FIXME: handle the CPU we're executing on separately for now until
-        * smp_call_function_many has been fixed to not skip it.
-        */
-       this_cpu = raw_smp_processor_id();
-       smp_call_function_single(this_cpu, __wrmsr_on_cpu, &rv, 1);
+       this_cpu = get_cpu();
+
+       if (cpumask_test_cpu(this_cpu, mask))
+               __wrmsr_on_cpu(&rv);
 
        smp_call_function_many(mask, __wrmsr_on_cpu, &rv, 1);
-       preempt_enable();
+       put_cpu();
 }
 EXPORT_SYMBOL(wrmsr_on_cpus);
 
index 1b734d7a896685123a0f95a3778b39a3ec891a6f..7e600c1962db0c77d2dcb66559b75aff79672580 100644 (file)
@@ -591,9 +591,12 @@ static int __change_page_attr(struct cpa_data *cpa, int primary)
        unsigned int level;
        pte_t *kpte, old_pte;
 
-       if (cpa->flags & CPA_PAGES_ARRAY)
-               address = (unsigned long)page_address(cpa->pages[cpa->curpage]);
-       else if (cpa->flags & CPA_ARRAY)
+       if (cpa->flags & CPA_PAGES_ARRAY) {
+               struct page *page = cpa->pages[cpa->curpage];
+               if (unlikely(PageHighMem(page)))
+                       return 0;
+               address = (unsigned long)page_address(page);
+       } else if (cpa->flags & CPA_ARRAY)
                address = cpa->vaddr[cpa->curpage];
        else
                address = *cpa->vaddr;
@@ -697,9 +700,12 @@ static int cpa_process_alias(struct cpa_data *cpa)
         * No need to redo, when the primary call touched the direct
         * mapping already:
         */
-       if (cpa->flags & CPA_PAGES_ARRAY)
-               vaddr = (unsigned long)page_address(cpa->pages[cpa->curpage]);
-       else if (cpa->flags & CPA_ARRAY)
+       if (cpa->flags & CPA_PAGES_ARRAY) {
+               struct page *page = cpa->pages[cpa->curpage];
+               if (unlikely(PageHighMem(page)))
+                       return 0;
+               vaddr = (unsigned long)page_address(page);
+       } else if (cpa->flags & CPA_ARRAY)
                vaddr = cpa->vaddr[cpa->curpage];
        else
                vaddr = *cpa->vaddr;
@@ -997,12 +1003,15 @@ EXPORT_SYMBOL(set_memory_array_uc);
 int _set_memory_wc(unsigned long addr, int numpages)
 {
        int ret;
+       unsigned long addr_copy = addr;
+
        ret = change_page_attr_set(&addr, numpages,
                                    __pgprot(_PAGE_CACHE_UC_MINUS), 0);
-
        if (!ret) {
-               ret = change_page_attr_set(&addr, numpages,
-                                   __pgprot(_PAGE_CACHE_WC), 0);
+               ret = change_page_attr_set_clr(&addr_copy, numpages,
+                                              __pgprot(_PAGE_CACHE_WC),
+                                              __pgprot(_PAGE_CACHE_MASK),
+                                              0, 0, NULL);
        }
        return ret;
 }
@@ -1119,7 +1128,9 @@ int set_pages_array_uc(struct page **pages, int addrinarray)
        int free_idx;
 
        for (i = 0; i < addrinarray; i++) {
-               start = (unsigned long)page_address(pages[i]);
+               if (PageHighMem(pages[i]))
+                       continue;
+               start = page_to_pfn(pages[i]) << PAGE_SHIFT;
                end = start + PAGE_SIZE;
                if (reserve_memtype(start, end, _PAGE_CACHE_UC_MINUS, NULL))
                        goto err_out;
@@ -1132,7 +1143,9 @@ int set_pages_array_uc(struct page **pages, int addrinarray)
 err_out:
        free_idx = i;
        for (i = 0; i < free_idx; i++) {
-               start = (unsigned long)page_address(pages[i]);
+               if (PageHighMem(pages[i]))
+                       continue;
+               start = page_to_pfn(pages[i]) << PAGE_SHIFT;
                end = start + PAGE_SIZE;
                free_memtype(start, end);
        }
@@ -1161,7 +1174,9 @@ int set_pages_array_wb(struct page **pages, int addrinarray)
                return retval;
 
        for (i = 0; i < addrinarray; i++) {
-               start = (unsigned long)page_address(pages[i]);
+               if (PageHighMem(pages[i]))
+                       continue;
+               start = page_to_pfn(pages[i]) << PAGE_SHIFT;
                end = start + PAGE_SIZE;
                free_memtype(start, end);
        }
index af8f9650058cfcf59ab46476ac174ec86e41de49..ed34f5e35999449a488be43ced0e580319b373f1 100644 (file)
@@ -329,7 +329,6 @@ void __init reserve_top_address(unsigned long reserve)
        printk(KERN_INFO "Reserving virtual address space above 0x%08x\n",
               (int)-reserve);
        __FIXADDR_TOP = -reserve - PAGE_SIZE;
-       __VMALLOC_RESERVE += reserve;
 #endif
 }
 
index b90eda8b34409680863edb45bc7b993ed87a1082..fd69086d08d54f0fb9c2036984cc9c9c88d86446 100644 (file)
@@ -858,6 +858,8 @@ static int cpufreq_add_dev(struct sys_device *sys_dev)
 
                /* Check for existing affected CPUs.
                 * They may not be aware of it due to CPU Hotplug.
+                * cpufreq_cpu_put is called when the device is removed
+                * in __cpufreq_remove_dev()
                 */
                managed_policy = cpufreq_cpu_get(j);
                if (unlikely(managed_policy)) {
@@ -884,7 +886,7 @@ static int cpufreq_add_dev(struct sys_device *sys_dev)
                        ret = sysfs_create_link(&sys_dev->kobj,
                                                &managed_policy->kobj,
                                                "cpufreq");
-                       if (!ret)
+                       if (ret)
                                cpufreq_cpu_put(managed_policy);
                        /*
                         * Success. We only needed to be added to the mask.
@@ -924,6 +926,8 @@ static int cpufreq_add_dev(struct sys_device *sys_dev)
 
        spin_lock_irqsave(&cpufreq_driver_lock, flags);
        for_each_cpu(j, policy->cpus) {
+               if (!cpu_online(j))
+                       continue;
                per_cpu(cpufreq_cpu_data, j) = policy;
                per_cpu(policy_cpu, j) = policy->cpu;
        }
@@ -1244,13 +1248,22 @@ EXPORT_SYMBOL(cpufreq_get);
 
 static int cpufreq_suspend(struct sys_device *sysdev, pm_message_t pmsg)
 {
-       int cpu = sysdev->id;
        int ret = 0;
+
+#ifdef __powerpc__
+       int cpu = sysdev->id;
        unsigned int cur_freq = 0;
        struct cpufreq_policy *cpu_policy;
 
        dprintk("suspending cpu %u\n", cpu);
 
+       /*
+        * This whole bogosity is here because Powerbooks are made of fail.
+        * No sane platform should need any of the code below to be run.
+        * (it's entirely the wrong thing to do, as driver->get may
+        *  reenable interrupts on some architectures).
+        */
+
        if (!cpu_online(cpu))
                return 0;
 
@@ -1309,6 +1322,7 @@ static int cpufreq_suspend(struct sys_device *sysdev, pm_message_t pmsg)
 
 out:
        cpufreq_cpu_put(cpu_policy);
+#endif /* __powerpc__ */
        return ret;
 }
 
@@ -1322,12 +1336,18 @@ out:
  */
 static int cpufreq_resume(struct sys_device *sysdev)
 {
-       int cpu = sysdev->id;
        int ret = 0;
+
+#ifdef __powerpc__
+       int cpu = sysdev->id;
        struct cpufreq_policy *cpu_policy;
 
        dprintk("resuming cpu %u\n", cpu);
 
+       /* As with the ->suspend method, all the code below is
+        * only necessary because Powerbooks suck.
+        * See commit 42d4dc3f4e1e for jokes. */
+
        if (!cpu_online(cpu))
                return 0;
 
@@ -1391,6 +1411,7 @@ out:
        schedule_work(&cpu_policy->update);
 fail:
        cpufreq_cpu_put(cpu_policy);
+#endif /* __powerpc__ */
        return ret;
 }
 
index 57490502b21cbddbd71c2ef38b0134b62e55d21d..bdea7e2f94baa9c6f3743a1bdefc84ba44376822 100644 (file)
@@ -63,6 +63,7 @@ struct cpu_dbs_info_s {
        unsigned int down_skip;
        unsigned int requested_freq;
        int cpu;
+       unsigned int enable:1;
        /*
         * percpu mutex that serializes governor limit change with
         * do_dbs_timer invocation. We do not want do_dbs_timer to run
@@ -141,6 +142,9 @@ dbs_cpufreq_notifier(struct notifier_block *nb, unsigned long val,
 
        struct cpufreq_policy *policy;
 
+       if (!this_dbs_info->enable)
+               return 0;
+
        policy = this_dbs_info->cur_policy;
 
        /*
@@ -497,6 +501,7 @@ static inline void dbs_timer_init(struct cpu_dbs_info_s *dbs_info)
        int delay = usecs_to_jiffies(dbs_tuners_ins.sampling_rate);
        delay -= jiffies % delay;
 
+       dbs_info->enable = 1;
        INIT_DELAYED_WORK_DEFERRABLE(&dbs_info->work, do_dbs_timer);
        queue_delayed_work_on(dbs_info->cpu, kconservative_wq, &dbs_info->work,
                                delay);
@@ -504,6 +509,7 @@ static inline void dbs_timer_init(struct cpu_dbs_info_s *dbs_info)
 
 static inline void dbs_timer_exit(struct cpu_dbs_info_s *dbs_info)
 {
+       dbs_info->enable = 0;
        cancel_delayed_work_sync(&dbs_info->work);
 }
 
index 92888aa907492e813be7ea7f6c9567f2fdd32d93..e85b1e4389e093e13c6ed23768c875ba49271dc1 100644 (file)
@@ -1,3 +1,10 @@
+Version 1.60
+-------------
+Fix memory leak in reconnect.  Fix oops in DFS mount error path.
+Set s_maxbytes to smaller (the max that vfs can handle) so that
+sendfile will now work over cifs mounts again.  Add noforcegid
+and noforceuid mount parameters.
+
 Version 1.59
 ------------
 Client uses server inode numbers (which are persistent) rather than
index ad92921dbde415b7a00d0c063d6ca9adfb0d582d..79c1a93400bea9e8b7c39603c1375a574e925b20 100644 (file)
@@ -262,11 +262,11 @@ A partial list of the supported mount options follows:
                mount.  
   domain       Set the SMB/CIFS workgroup name prepended to the
                username during CIFS session establishment
-  forceuid     Set the default uid for inodes based on the uid
-               passed in. For mounts to servers
+  forceuid     Set the default uid for inodes to the uid
+               passed in on mount. For mounts to servers
                which do support the CIFS Unix extensions, such as a
                properly configured Samba server, the server provides
-               the uid, gid and mode so this parameter should  not be
+               the uid, gid and mode so this parameter should not be
                specified unless the server and clients uid and gid
                numbering differ.  If the server and client are in the
                same domain (e.g. running winbind or nss_ldap) and
@@ -278,11 +278,7 @@ A partial list of the supported mount options follows:
                of existing files will be the uid (gid) of the person
                who executed the mount (root, except when mount.cifs
                is configured setuid for user mounts) unless the "uid=" 
-               (gid) mount option is specified.  For the uid (gid) of newly
-               created files and directories, ie files created since 
-               the last mount of the server share, the expected uid 
-               (gid) is cached as long as the inode remains in 
-               memory on the client.   Also note that permission
+               (gid) mount option is specified. Also note that permission
                checks (authorization checks) on accesses to a file occur
                at the server, but there are cases in which an administrator
                may want to restrict at the client as well.  For those
@@ -290,12 +286,15 @@ A partial list of the supported mount options follows:
                (such as Windows), permissions can also be checked at the
                client, and a crude form of client side permission checking 
                can be enabled by specifying file_mode and dir_mode on 
-               the client.  Note that the mount.cifs helper must be
-               at version 1.10 or higher to support specifying the uid
-               (or gid) in non-numeric form.
-  forcegid     (similar to above but for the groupid instead of uid)
+               the client.  (default)
+  forcegid     (similar to above but for the groupid instead of uid) (default)
+  noforceuid   Fill in file owner information (uid) by requesting it from
+               the server if possible. With this option, the value given in
+               the uid= option (on mount) will only be used if the server
+               can not support returning uids on inodes.
+  noforcegid   (similar to above but for the group owner, gid, instead of uid)
   uid          Set the default uid for inodes, and indicate to the
-               cifs kernel driver which local user mounted . If the server
+               cifs kernel driver which local user mounted. If the server
                supports the unix extensions the default uid is
                not used to fill in the owner fields of inodes (files)
                unless the "forceuid" parameter is specified.
index 3bb11be8b6a8210271368fc8b6c44942c77a02a7..606912d8f2a885d9272a843e34542adc1cc9c3d0 100644 (file)
@@ -55,7 +55,7 @@ void cifs_dfs_release_automount_timer(void)
  * i.e. strips from UNC trailing path that is not part of share
  * name and fixup missing '\' in the begining of DFS node refferal
  * if neccessary.
- * Returns pointer to share name on success or NULL on error.
+ * Returns pointer to share name on success or ERR_PTR on error.
  * Caller is responsible for freeing returned string.
  */
 static char *cifs_get_share_name(const char *node_name)
@@ -68,7 +68,7 @@ static char *cifs_get_share_name(const char *node_name)
        UNC = kmalloc(len+2 /*for term null and additional \ if it's missed */,
                         GFP_KERNEL);
        if (!UNC)
-               return NULL;
+               return ERR_PTR(-ENOMEM);
 
        /* get share name and server name */
        if (node_name[1] != '\\') {
@@ -87,7 +87,7 @@ static char *cifs_get_share_name(const char *node_name)
                cERROR(1, ("%s: no server name end in node name: %s",
                        __func__, node_name));
                kfree(UNC);
-               return NULL;
+               return ERR_PTR(-EINVAL);
        }
 
        /* find sharename end */
@@ -133,6 +133,12 @@ char *cifs_compose_mount_options(const char *sb_mountdata,
                return ERR_PTR(-EINVAL);
 
        *devname = cifs_get_share_name(ref->node_name);
+       if (IS_ERR(*devname)) {
+               rc = PTR_ERR(*devname);
+               *devname = NULL;
+               goto compose_mount_options_err;
+       }
+
        rc = dns_resolve_server_name_to_ip(*devname, &srvIP);
        if (rc != 0) {
                cERROR(1, ("%s: Failed to resolve server part of %s to IP: %d",
index 60e3c4253de0b9774cb79767966847779c6d92b5..714a542cbafce7f3efbe242339bec3d99a0c929f 100644 (file)
@@ -44,7 +44,7 @@ cifs_ucs2_bytes(const __le16 *from, int maxbytes,
        int maxwords = maxbytes / 2;
        char tmp[NLS_MAX_CHARSET_SIZE];
 
-       for (i = 0; from[i] && i < maxwords; i++) {
+       for (i = 0; i < maxwords && from[i]; i++) {
                charlen = codepage->uni2char(le16_to_cpu(from[i]), tmp,
                                             NLS_MAX_CHARSET_SIZE);
                if (charlen > 0)
index 44f30504b82d1bbe511da6d4def1342067359deb..84b75253b05a01cf13748b33d642e58a515e7c41 100644 (file)
@@ -376,10 +376,14 @@ cifs_show_options(struct seq_file *s, struct vfsmount *m)
        seq_printf(s, ",uid=%d", cifs_sb->mnt_uid);
        if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_OVERR_UID)
                seq_printf(s, ",forceuid");
+       else
+               seq_printf(s, ",noforceuid");
 
        seq_printf(s, ",gid=%d", cifs_sb->mnt_gid);
        if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_OVERR_GID)
                seq_printf(s, ",forcegid");
+       else
+               seq_printf(s, ",noforcegid");
 
        cifs_show_address(s, tcon->ses->server);
 
index fc44d316d0bb4702eaa8d083cf9ed0eb746304ca..1f3345d7fa79a5e5dffc6f7be54f9734873ed3da 100644 (file)
@@ -803,6 +803,10 @@ cifs_parse_mount_options(char *options, const char *devname,
        char *data;
        unsigned int  temp_len, i, j;
        char separator[2];
+       short int override_uid = -1;
+       short int override_gid = -1;
+       bool uid_specified = false;
+       bool gid_specified = false;
 
        separator[0] = ',';
        separator[1] = 0;
@@ -1093,18 +1097,20 @@ cifs_parse_mount_options(char *options, const char *devname,
                                                    "too long.\n");
                                return 1;
                        }
-               } else if (strnicmp(data, "uid", 3) == 0) {
-                       if (value && *value)
-                               vol->linux_uid =
-                                       simple_strtoul(value, &value, 0);
-               } else if (strnicmp(data, "forceuid", 8) == 0) {
-                               vol->override_uid = 1;
-               } else if (strnicmp(data, "gid", 3) == 0) {
-                       if (value && *value)
-                               vol->linux_gid =
-                                       simple_strtoul(value, &value, 0);
-               } else if (strnicmp(data, "forcegid", 8) == 0) {
-                               vol->override_gid = 1;
+               } else if (!strnicmp(data, "uid", 3) && value && *value) {
+                       vol->linux_uid = simple_strtoul(value, &value, 0);
+                       uid_specified = true;
+               } else if (!strnicmp(data, "forceuid", 8)) {
+                       override_uid = 1;
+               } else if (!strnicmp(data, "noforceuid", 10)) {
+                       override_uid = 0;
+               } else if (!strnicmp(data, "gid", 3) && value && *value) {
+                       vol->linux_gid = simple_strtoul(value, &value, 0);
+                       gid_specified = true;
+               } else if (!strnicmp(data, "forcegid", 8)) {
+                       override_gid = 1;
+               } else if (!strnicmp(data, "noforcegid", 10)) {
+                       override_gid = 0;
                } else if (strnicmp(data, "file_mode", 4) == 0) {
                        if (value && *value) {
                                vol->file_mode =
@@ -1355,6 +1361,18 @@ cifs_parse_mount_options(char *options, const char *devname,
        if (vol->UNCip == NULL)
                vol->UNCip = &vol->UNC[2];
 
+       if (uid_specified)
+               vol->override_uid = override_uid;
+       else if (override_uid == 1)
+               printk(KERN_NOTICE "CIFS: ignoring forceuid mount option "
+                                  "specified with no uid= option.\n");
+
+       if (gid_specified)
+               vol->override_gid = override_gid;
+       else if (override_gid == 1)
+               printk(KERN_NOTICE "CIFS: ignoring forcegid mount option "
+                                  "specified with no gid= option.\n");
+
        return 0;
 }
 
@@ -2544,11 +2562,20 @@ remote_path_check:
 
                        if (mount_data != mount_data_global)
                                kfree(mount_data);
+
                        mount_data = cifs_compose_mount_options(
                                        cifs_sb->mountdata, full_path + 1,
                                        referrals, &fake_devname);
-                       kfree(fake_devname);
+
                        free_dfs_info_array(referrals, num_referrals);
+                       kfree(fake_devname);
+                       kfree(full_path);
+
+                       if (IS_ERR(mount_data)) {
+                               rc = PTR_ERR(mount_data);
+                               mount_data = NULL;
+                               goto mount_fail_check;
+                       }
 
                        if (tcon)
                                cifs_put_tcon(tcon);
@@ -2556,8 +2583,6 @@ remote_path_check:
                                cifs_put_smb_ses(pSesInfo);
 
                        cleanup_volume_info(&volume_info);
-                       FreeXid(xid);
-                       kfree(full_path);
                        referral_walks_count++;
                        goto try_mount_again;
                }
index 3d3ddb3f51775301533daf55ff21e331a360ff63..2dfd47714ae5b7329448b107cebd1614989e6e89 100644 (file)
@@ -412,8 +412,10 @@ nilfs_mdt_write_page(struct page *page, struct writeback_control *wbc)
                return 0; /* Do not request flush for shadow page cache */
        if (!sb) {
                writer = nilfs_get_writer(NILFS_MDT(inode)->mi_nilfs);
-               if (!writer)
+               if (!writer) {
+                       nilfs_put_writer(NILFS_MDT(inode)->mi_nilfs);
                        return -EROFS;
+               }
                sb = writer->s_super;
        }
 
index 8b5e4778cf28bc780fcf516400ccc7a2e963c076..51ff3d0a4ee256445f8ddbe9e85d7ff2ae2a7798 100644 (file)
@@ -1859,12 +1859,26 @@ static void nilfs_end_page_io(struct page *page, int err)
        if (!page)
                return;
 
-       if (buffer_nilfs_node(page_buffers(page)) && !PageWriteback(page))
+       if (buffer_nilfs_node(page_buffers(page)) && !PageWriteback(page)) {
                /*
                 * For b-tree node pages, this function may be called twice
                 * or more because they might be split in a segment.
                 */
+               if (PageDirty(page)) {
+                       /*
+                        * For pages holding split b-tree node buffers, dirty
+                        * flag on the buffers may be cleared discretely.
+                        * In that case, the page is once redirtied for
+                        * remaining buffers, and it must be cancelled if
+                        * all the buffers get cleaned later.
+                        */
+                       lock_page(page);
+                       if (nilfs_page_buffers_clean(page))
+                               __nilfs_clear_page_dirty(page);
+                       unlock_page(page);
+               }
                return;
+       }
 
        __nilfs_end_page_io(page, err);
 }