From 09128d5790cdbb1f694c31bc190cd2adf3360dd2 Mon Sep 17 00:00:00 2001 From: NeilBrown Date: Tue, 20 Apr 2010 14:13:34 +1000 Subject: [PATCH] --- yaml --- r: 190068 b: refs/heads/master c: 35f2a591192d0a5d9f7fc696869c76f0b8e49c3d h: refs/heads/master v: v3 --- [refs] | 2 +- trunk/Makefile | 4 +- trunk/arch/sparc/include/asm/thread_info_64.h | 2 +- trunk/arch/sparc/kernel/irq_64.c | 20 ++- trunk/arch/sparc/kernel/kstack.h | 19 --- trunk/arch/sparc/kernel/nmi.c | 7 - trunk/arch/sparc/kernel/rtrap_64.S | 12 +- trunk/arch/sparc/kernel/unaligned_64.c | 6 +- trunk/arch/sparc/lib/mcount.S | 8 +- trunk/arch/x86/ia32/ia32entry.S | 2 +- trunk/arch/x86/kernel/dumpstack.h | 8 +- trunk/drivers/char/pcmcia/cm4000_cs.c | 8 +- trunk/drivers/gpu/drm/drm_stub.c | 4 +- trunk/drivers/isdn/gigaset/gigaset.h | 1 - trunk/drivers/md/raid5.c | 19 +-- trunk/drivers/pcmcia/cistpl.c | 9 +- trunk/drivers/pcmcia/db1xxx_ss.c | 4 +- trunk/drivers/pcmcia/ds.c | 22 ++- trunk/drivers/pcmcia/pcmcia_resource.c | 10 +- trunk/drivers/pcmcia/rsrc_nonstatic.c | 16 +-- trunk/drivers/serial/serial_cs.c | 9 -- trunk/fs/afs/mntpt.c | 24 ++-- trunk/fs/ecryptfs/crypto.c | 37 ++--- trunk/fs/ecryptfs/ecryptfs_kernel.h | 13 +- trunk/fs/ecryptfs/inode.c | 129 +++++++++--------- trunk/fs/ecryptfs/mmap.c | 38 +++--- trunk/fs/ecryptfs/super.c | 1 + trunk/fs/quota/Kconfig | 8 -- trunk/fs/quota/dquot.c | 16 ++- trunk/mm/rmap.c | 27 ++-- 30 files changed, 197 insertions(+), 288 deletions(-) diff --git a/[refs] b/[refs] index 14e6d652d7a9..119886d069bc 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 083fd8b21a13742b37ab347089c73f895a896672 +refs/heads/master: 35f2a591192d0a5d9f7fc696869c76f0b8e49c3d diff --git a/trunk/Makefile b/trunk/Makefile index fa1db9001754..975461551531 100644 --- a/trunk/Makefile +++ b/trunk/Makefile @@ -1,8 +1,8 @@ VERSION = 2 PATCHLEVEL = 6 SUBLEVEL = 34 -EXTRAVERSION = -rc5 -NAME = Sheep on Meth +EXTRAVERSION = -rc4 +NAME = Man-Eating Seals of Antiquity # *DOCUMENTATION* # To see a list of typical targets execute "make help" diff --git a/trunk/arch/sparc/include/asm/thread_info_64.h b/trunk/arch/sparc/include/asm/thread_info_64.h index 4827a3aeac7f..9e2d9447f2ad 100644 --- a/trunk/arch/sparc/include/asm/thread_info_64.h +++ b/trunk/arch/sparc/include/asm/thread_info_64.h @@ -111,7 +111,7 @@ struct thread_info { #define THREAD_SHIFT PAGE_SHIFT #endif /* PAGE_SHIFT == 13 */ -#define PREEMPT_ACTIVE 0x10000000 +#define PREEMPT_ACTIVE 0x4000000 /* * macros/functions for gaining access to the thread information structure diff --git a/trunk/arch/sparc/kernel/irq_64.c b/trunk/arch/sparc/kernel/irq_64.c index 830d70a3e20b..454ce3a25273 100644 --- a/trunk/arch/sparc/kernel/irq_64.c +++ b/trunk/arch/sparc/kernel/irq_64.c @@ -22,7 +22,6 @@ #include #include #include -#include #include #include @@ -47,7 +46,6 @@ #include "entry.h" #include "cpumap.h" -#include "kstack.h" #define NUM_IVECS (IMAP_INR + 1) @@ -714,6 +712,24 @@ void ack_bad_irq(unsigned int virt_irq) void *hardirq_stack[NR_CPUS]; void *softirq_stack[NR_CPUS]; +static __attribute__((always_inline)) void *set_hardirq_stack(void) +{ + void *orig_sp, *sp = hardirq_stack[smp_processor_id()]; + + __asm__ __volatile__("mov %%sp, %0" : "=r" (orig_sp)); + if (orig_sp < sp || + orig_sp > (sp + THREAD_SIZE)) { + sp += THREAD_SIZE - 192 - STACK_BIAS; + __asm__ __volatile__("mov %0, %%sp" : : "r" (sp)); + } + + return orig_sp; +} +static __attribute__((always_inline)) void restore_hardirq_stack(void *orig_sp) +{ + __asm__ __volatile__("mov %0, %%sp" : : "r" (orig_sp)); +} + void __irq_entry handler_irq(int irq, struct pt_regs *regs) { unsigned long pstate, bucket_pa; diff --git a/trunk/arch/sparc/kernel/kstack.h b/trunk/arch/sparc/kernel/kstack.h index 53dfb92e09fb..5247283d1c03 100644 --- a/trunk/arch/sparc/kernel/kstack.h +++ b/trunk/arch/sparc/kernel/kstack.h @@ -61,23 +61,4 @@ static inline bool kstack_is_trap_frame(struct thread_info *tp, struct pt_regs * } -static inline __attribute__((always_inline)) void *set_hardirq_stack(void) -{ - void *orig_sp, *sp = hardirq_stack[smp_processor_id()]; - - __asm__ __volatile__("mov %%sp, %0" : "=r" (orig_sp)); - if (orig_sp < sp || - orig_sp > (sp + THREAD_SIZE)) { - sp += THREAD_SIZE - 192 - STACK_BIAS; - __asm__ __volatile__("mov %0, %%sp" : : "r" (sp)); - } - - return orig_sp; -} - -static inline __attribute__((always_inline)) void restore_hardirq_stack(void *orig_sp) -{ - __asm__ __volatile__("mov %0, %%sp" : : "r" (orig_sp)); -} - #endif /* _KSTACK_H */ diff --git a/trunk/arch/sparc/kernel/nmi.c b/trunk/arch/sparc/kernel/nmi.c index a4bd7ba74c89..75a3d1a25356 100644 --- a/trunk/arch/sparc/kernel/nmi.c +++ b/trunk/arch/sparc/kernel/nmi.c @@ -23,8 +23,6 @@ #include #include -#include "kstack.h" - /* We don't have a real NMI on sparc64, but we can fake one * up using profiling counter overflow interrupts and interrupt * levels. @@ -94,7 +92,6 @@ static void die_nmi(const char *str, struct pt_regs *regs, int do_panic) notrace __kprobes void perfctr_irq(int irq, struct pt_regs *regs) { unsigned int sum, touched = 0; - void *orig_sp; clear_softint(1 << irq); @@ -102,8 +99,6 @@ notrace __kprobes void perfctr_irq(int irq, struct pt_regs *regs) nmi_enter(); - orig_sp = set_hardirq_stack(); - if (notify_die(DIE_NMI, "nmi", regs, 0, pt_regs_trap_type(regs), SIGINT) == NOTIFY_STOP) touched = 1; @@ -129,8 +124,6 @@ notrace __kprobes void perfctr_irq(int irq, struct pt_regs *regs) pcr_ops->write(pcr_enable); } - restore_hardirq_stack(orig_sp); - nmi_exit(); } diff --git a/trunk/arch/sparc/kernel/rtrap_64.S b/trunk/arch/sparc/kernel/rtrap_64.S index 090b9e9ad5e3..83f1873c6c13 100644 --- a/trunk/arch/sparc/kernel/rtrap_64.S +++ b/trunk/arch/sparc/kernel/rtrap_64.S @@ -130,17 +130,7 @@ rtrap_xcall: nop call trace_hardirqs_on nop - /* Do not actually set the %pil here. We will do that - * below after we clear PSTATE_IE in the %pstate register. - * If we re-enable interrupts here, we can recurse down - * the hardirq stack potentially endlessly, causing a - * stack overflow. - * - * It is tempting to put this test and trace_hardirqs_on - * call at the 'rt_continue' label, but that will not work - * as that path hits unconditionally and we do not want to - * execute this in NMI return paths, for example. - */ + wrpr %l4, %pil #endif rtrap_no_irq_enable: andcc %l1, TSTATE_PRIV, %l3 diff --git a/trunk/arch/sparc/kernel/unaligned_64.c b/trunk/arch/sparc/kernel/unaligned_64.c index c752c4c479bd..ebce43018c49 100644 --- a/trunk/arch/sparc/kernel/unaligned_64.c +++ b/trunk/arch/sparc/kernel/unaligned_64.c @@ -50,7 +50,7 @@ static inline enum direction decode_direction(unsigned int insn) } /* 16 = double-word, 8 = extra-word, 4 = word, 2 = half-word */ -static inline int decode_access_size(struct pt_regs *regs, unsigned int insn) +static inline int decode_access_size(unsigned int insn) { unsigned int tmp; @@ -66,7 +66,7 @@ static inline int decode_access_size(struct pt_regs *regs, unsigned int insn) return 2; else { printk("Impossible unaligned trap. insn=%08x\n", insn); - die_if_kernel("Byte sized unaligned access?!?!", regs); + die_if_kernel("Byte sized unaligned access?!?!", current_thread_info()->kregs); /* GCC should never warn that control reaches the end * of this function without returning a value because @@ -286,7 +286,7 @@ static void log_unaligned(struct pt_regs *regs) asmlinkage void kernel_unaligned_trap(struct pt_regs *regs, unsigned int insn) { enum direction dir = decode_direction(insn); - int size = decode_access_size(regs, insn); + int size = decode_access_size(insn); int orig_asi, asi; current_thread_info()->kern_una_regs = regs; diff --git a/trunk/arch/sparc/lib/mcount.S b/trunk/arch/sparc/lib/mcount.S index 3ad6cbdc2163..3753e3c6e176 100644 --- a/trunk/arch/sparc/lib/mcount.S +++ b/trunk/arch/sparc/lib/mcount.S @@ -34,7 +34,7 @@ mcount: cmp %g1, %g2 be,pn %icc, 1f mov %i7, %g3 - save %sp, -176, %sp + save %sp, -128, %sp mov %g3, %o1 jmpl %g1, %o7 mov %i7, %o0 @@ -56,7 +56,7 @@ mcount: nop 5: mov %i7, %g2 mov %fp, %g3 - save %sp, -176, %sp + save %sp, -128, %sp mov %g2, %l0 ba,pt %xcc, ftrace_graph_caller mov %g3, %l1 @@ -85,7 +85,7 @@ ftrace_caller: lduw [%g1 + %lo(function_trace_stop)], %g1 brnz,pn %g1, ftrace_stub mov %fp, %g3 - save %sp, -176, %sp + save %sp, -128, %sp mov %g2, %o1 mov %g2, %l0 mov %g3, %l1 @@ -120,7 +120,7 @@ ENTRY(ftrace_graph_caller) END(ftrace_graph_caller) ENTRY(return_to_handler) - save %sp, -176, %sp + save %sp, -128, %sp call ftrace_return_to_handler mov %fp, %o0 jmpl %o0 + 8, %g0 diff --git a/trunk/arch/x86/ia32/ia32entry.S b/trunk/arch/x86/ia32/ia32entry.S index e790bc1fbfa3..59b4556a5b92 100644 --- a/trunk/arch/x86/ia32/ia32entry.S +++ b/trunk/arch/x86/ia32/ia32entry.S @@ -626,7 +626,7 @@ ia32_sys_call_table: .quad stub32_sigreturn .quad stub32_clone /* 120 */ .quad sys_setdomainname - .quad sys_newuname + .quad sys_uname .quad sys_modify_ldt .quad compat_sys_adjtimex .quad sys32_mprotect /* 125 */ diff --git a/trunk/arch/x86/kernel/dumpstack.h b/trunk/arch/x86/kernel/dumpstack.h index e1a93be4fd44..e39e77168a37 100644 --- a/trunk/arch/x86/kernel/dumpstack.h +++ b/trunk/arch/x86/kernel/dumpstack.h @@ -14,8 +14,6 @@ #define get_bp(bp) asm("movq %%rbp, %0" : "=r" (bp) :) #endif -#include - extern void show_trace_log_lvl(struct task_struct *task, struct pt_regs *regs, unsigned long *stack, unsigned long bp, char *log_lvl); @@ -44,10 +42,8 @@ static inline unsigned long rewind_frame_pointer(int n) get_bp(frame); #ifdef CONFIG_FRAME_POINTER - while (n--) { - if (probe_kernel_address(&frame->next_frame, frame)) - break; - } + while (n--) + frame = frame->next_frame; #endif return (unsigned long)frame; diff --git a/trunk/drivers/char/pcmcia/cm4000_cs.c b/trunk/drivers/char/pcmcia/cm4000_cs.c index 90b199f97bec..c9bc896d68af 100644 --- a/trunk/drivers/char/pcmcia/cm4000_cs.c +++ b/trunk/drivers/char/pcmcia/cm4000_cs.c @@ -1026,16 +1026,14 @@ static ssize_t cmm_read(struct file *filp, __user char *buf, size_t count, xoutb(0, REG_FLAGS1(iobase)); /* clear detectCMM */ /* last check before exit */ - if (!io_detect_cm4000(iobase, dev)) { - rc = -ENODEV; - goto release_io; - } + if (!io_detect_cm4000(iobase, dev)) + count = -ENODEV; if (test_bit(IS_INVREV, &dev->flags) && count > 0) str_invert_revert(dev->rbuf, count); if (copy_to_user(buf, dev->rbuf, count)) - rc = -EFAULT; + return -EFAULT; release_io: clear_bit(LOCK_IO, &dev->flags); diff --git a/trunk/drivers/gpu/drm/drm_stub.c b/trunk/drivers/gpu/drm/drm_stub.c index a0c365f2e521..b743411d8144 100644 --- a/trunk/drivers/gpu/drm/drm_stub.c +++ b/trunk/drivers/gpu/drm/drm_stub.c @@ -516,6 +516,8 @@ void drm_put_dev(struct drm_device *dev) } driver = dev->driver; + drm_vblank_cleanup(dev); + drm_lastclose(dev); if (drm_core_has_MTRR(dev) && drm_core_has_AGP(dev) && @@ -535,8 +537,6 @@ void drm_put_dev(struct drm_device *dev) dev->agp = NULL; } - drm_vblank_cleanup(dev); - list_for_each_entry_safe(r_list, list_temp, &dev->maplist, head) drm_rmmap(dev, r_list->map); drm_ht_remove(&dev->map_hash); diff --git a/trunk/drivers/isdn/gigaset/gigaset.h b/trunk/drivers/isdn/gigaset/gigaset.h index 05947f9c1849..d32efb651042 100644 --- a/trunk/drivers/isdn/gigaset/gigaset.h +++ b/trunk/drivers/isdn/gigaset/gigaset.h @@ -20,7 +20,6 @@ #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt #include -#include #include #include #include diff --git a/trunk/drivers/md/raid5.c b/trunk/drivers/md/raid5.c index e3e9a36ea3b7..20e48401910e 100644 --- a/trunk/drivers/md/raid5.c +++ b/trunk/drivers/md/raid5.c @@ -1650,8 +1650,8 @@ static sector_t raid5_compute_sector(raid5_conf_t *conf, sector_t r_sector, int previous, int *dd_idx, struct stripe_head *sh) { - long stripe; - unsigned long chunk_number; + sector_t stripe; + sector_t chunk_number; unsigned int chunk_offset; int pd_idx, qd_idx; int ddf_layout = 0; @@ -1671,17 +1671,12 @@ static sector_t raid5_compute_sector(raid5_conf_t *conf, sector_t r_sector, */ chunk_offset = sector_div(r_sector, sectors_per_chunk); chunk_number = r_sector; - BUG_ON(r_sector != chunk_number); /* * Compute the stripe number */ - stripe = chunk_number / data_disks; - - /* - * Compute the data disk and parity disk indexes inside the stripe - */ - *dd_idx = chunk_number % data_disks; + stripe = chunk_number; + *dd_idx = sector_div(stripe, data_disks); /* * Select the parity disk based on the user selected algorithm. @@ -1870,14 +1865,14 @@ static sector_t compute_blocknr(struct stripe_head *sh, int i, int previous) : conf->algorithm; sector_t stripe; int chunk_offset; - int chunk_number, dummy1, dd_idx = i; + sector_t chunk_number; + int dummy1, dd_idx = i; sector_t r_sector; struct stripe_head sh2; chunk_offset = sector_div(new_sector, sectors_per_chunk); stripe = new_sector; - BUG_ON(new_sector != stripe); if (i == sh->pd_idx) return 0; @@ -1970,7 +1965,7 @@ static sector_t compute_blocknr(struct stripe_head *sh, int i, int previous) } chunk_number = stripe * data_disks + i; - r_sector = (sector_t)chunk_number * sectors_per_chunk + chunk_offset; + r_sector = chunk_number * sectors_per_chunk + chunk_offset; check = raid5_compute_sector(conf, r_sector, previous, &dummy1, &sh2); diff --git a/trunk/drivers/pcmcia/cistpl.c b/trunk/drivers/pcmcia/cistpl.c index 854959cada3a..f230f6543bff 100644 --- a/trunk/drivers/pcmcia/cistpl.c +++ b/trunk/drivers/pcmcia/cistpl.c @@ -1484,11 +1484,6 @@ int pccard_validate_cis(struct pcmcia_socket *s, unsigned int *info) if (!s) return -EINVAL; - if (s->functions) { - WARN_ON(1); - return -EINVAL; - } - /* We do not want to validate the CIS cache... */ mutex_lock(&s->ops_mutex); destroy_cis_cache(s); @@ -1644,7 +1639,7 @@ static ssize_t pccard_show_cis(struct kobject *kobj, count = 0; else { struct pcmcia_socket *s; - unsigned int chains = 1; + unsigned int chains; if (off + count > size) count = size - off; @@ -1653,7 +1648,7 @@ static ssize_t pccard_show_cis(struct kobject *kobj, if (!(s->state & SOCKET_PRESENT)) return -ENODEV; - if (!s->functions && pccard_validate_cis(s, &chains)) + if (pccard_validate_cis(s, &chains)) return -EIO; if (!chains) return -ENODATA; diff --git a/trunk/drivers/pcmcia/db1xxx_ss.c b/trunk/drivers/pcmcia/db1xxx_ss.c index 2d48196a48cd..6206408e196c 100644 --- a/trunk/drivers/pcmcia/db1xxx_ss.c +++ b/trunk/drivers/pcmcia/db1xxx_ss.c @@ -166,10 +166,8 @@ static int db1x_pcmcia_setup_irqs(struct db1x_pcmcia_sock *sock) ret = request_irq(sock->insert_irq, db1200_pcmcia_cdirq, IRQF_DISABLED, "pcmcia_insert", sock); - if (ret) { - local_irq_restore(flags); + if (ret) goto out1; - } ret = request_irq(sock->eject_irq, db1200_pcmcia_cdirq, IRQF_DISABLED, "pcmcia_eject", sock); diff --git a/trunk/drivers/pcmcia/ds.c b/trunk/drivers/pcmcia/ds.c index 4014cf8e4a26..cb6036d89e59 100644 --- a/trunk/drivers/pcmcia/ds.c +++ b/trunk/drivers/pcmcia/ds.c @@ -687,10 +687,12 @@ static void pcmcia_requery(struct pcmcia_socket *s) new_funcs = mfc.nfn; else new_funcs = 1; - if (old_funcs != new_funcs) { - /* we need to re-start */ + if (old_funcs > new_funcs) { pcmcia_card_remove(s, NULL); pcmcia_card_add(s); + } else if (new_funcs > old_funcs) { + s->functions = new_funcs; + pcmcia_device_add(s, 1); } } @@ -726,8 +728,6 @@ static int pcmcia_load_firmware(struct pcmcia_device *dev, char * filename) struct pcmcia_socket *s = dev->socket; const struct firmware *fw; int ret = -ENOMEM; - cistpl_longlink_mfc_t mfc; - int old_funcs, new_funcs = 1; if (!filename) return -EINVAL; @@ -750,14 +750,6 @@ static int pcmcia_load_firmware(struct pcmcia_device *dev, char * filename) goto release; } - /* we need to re-start if the number of functions changed */ - old_funcs = s->functions; - if (!pccard_read_tuple(s, BIND_FN_ALL, CISTPL_LONGLINK_MFC, - &mfc)) - new_funcs = mfc.nfn; - - if (old_funcs != new_funcs) - ret = -EBUSY; /* update information */ pcmcia_device_query(dev); @@ -866,8 +858,10 @@ static inline int pcmcia_devmatch(struct pcmcia_device *dev, if (did->match_flags & PCMCIA_DEV_ID_MATCH_FAKE_CIS) { dev_dbg(&dev->dev, "device needs a fake CIS\n"); if (!dev->socket->fake_cis) - if (pcmcia_load_firmware(dev, did->cisfile)) - return 0; + pcmcia_load_firmware(dev, did->cisfile); + + if (!dev->socket->fake_cis) + return 0; } if (did->match_flags & PCMCIA_DEV_ID_MATCH_ANONYMOUS) { diff --git a/trunk/drivers/pcmcia/pcmcia_resource.c b/trunk/drivers/pcmcia/pcmcia_resource.c index 7c3d03bb4f30..caec1dee2a4b 100644 --- a/trunk/drivers/pcmcia/pcmcia_resource.c +++ b/trunk/drivers/pcmcia/pcmcia_resource.c @@ -755,12 +755,12 @@ int pcmcia_request_irq(struct pcmcia_device *p_dev, irq_req_t *req) else printk(KERN_WARNING "pcmcia: Driver needs updating to support IRQ sharing.\n"); - /* If the interrupt is already assigned, it must be the same */ - if (s->irq.AssignedIRQ != 0) - irq = s->irq.AssignedIRQ; - #ifdef CONFIG_PCMCIA_PROBE - if (!irq) { + + if (s->irq.AssignedIRQ != 0) { + /* If the interrupt is already assigned, it must be the same */ + irq = s->irq.AssignedIRQ; + } else { int try; u32 mask = s->irq_mask; void *data = p_dev; /* something unique to this device */ diff --git a/trunk/drivers/pcmcia/rsrc_nonstatic.c b/trunk/drivers/pcmcia/rsrc_nonstatic.c index a6eb7b59ba9f..559069a80a3b 100644 --- a/trunk/drivers/pcmcia/rsrc_nonstatic.c +++ b/trunk/drivers/pcmcia/rsrc_nonstatic.c @@ -214,7 +214,7 @@ static void do_io_probe(struct pcmcia_socket *s, unsigned int base, return; } for (i = base, most = 0; i < base+num; i += 8) { - res = claim_region(s, i, 8, IORESOURCE_IO, "PCMCIA ioprobe"); + res = claim_region(NULL, i, 8, IORESOURCE_IO, "PCMCIA ioprobe"); if (!res) continue; hole = inb(i); @@ -231,14 +231,9 @@ static void do_io_probe(struct pcmcia_socket *s, unsigned int base, bad = any = 0; for (i = base; i < base+num; i += 8) { - res = claim_region(s, i, 8, IORESOURCE_IO, "PCMCIA ioprobe"); - if (!res) { - if (!any) - printk(" excluding"); - if (!bad) - bad = any = i; + res = claim_region(NULL, i, 8, IORESOURCE_IO, "PCMCIA ioprobe"); + if (!res) continue; - } for (j = 0; j < 8; j++) if (inb(i+j) != most) break; @@ -258,7 +253,6 @@ static void do_io_probe(struct pcmcia_socket *s, unsigned int base, } if (bad) { if ((num > 16) && (bad == base) && (i == base+num)) { - sub_interval(&s_data->io_db, bad, i-bad); printk(" nothing: probe failed.\n"); return; } else { @@ -810,7 +804,7 @@ static int adjust_memory(struct pcmcia_socket *s, unsigned int action, unsigned static int adjust_io(struct pcmcia_socket *s, unsigned int action, unsigned long start, unsigned long end) { struct socket_data *data = s->resource_data; - unsigned long size; + unsigned long size = end - start + 1; int ret = 0; #if defined(CONFIG_X86) @@ -820,8 +814,6 @@ static int adjust_io(struct pcmcia_socket *s, unsigned int action, unsigned long start = 0x100; #endif - size = end - start + 1; - if (end < start) return -EINVAL; diff --git a/trunk/drivers/serial/serial_cs.c b/trunk/drivers/serial/serial_cs.c index 8cfa5b12ea7a..175d202ab37e 100644 --- a/trunk/drivers/serial/serial_cs.c +++ b/trunk/drivers/serial/serial_cs.c @@ -105,10 +105,6 @@ struct serial_cfg_mem { * manfid 0x0160, 0x0104 * This card appears to have a 14.7456MHz clock. */ -/* Generic Modem: MD55x (GPRS/EDGE) have - * Elan VPU16551 UART with 14.7456MHz oscillator - * manfid 0x015D, 0x4C45 - */ static void quirk_setup_brainboxes_0104(struct pcmcia_device *link, struct uart_port *port) { port->uartclk = 14745600; @@ -199,11 +195,6 @@ static const struct serial_quirk quirks[] = { .prodid = 0x0104, .multi = -1, .setup = quirk_setup_brainboxes_0104, - }, { - .manfid = 0x015D, - .prodid = 0x4C45, - .multi = -1, - .setup = quirk_setup_brainboxes_0104, }, { .manfid = MANFID_IBM, .prodid = ~0, diff --git a/trunk/fs/afs/mntpt.c b/trunk/fs/afs/mntpt.c index b3feddc4f7d6..5e813a816ce4 100644 --- a/trunk/fs/afs/mntpt.c +++ b/trunk/fs/afs/mntpt.c @@ -138,9 +138,9 @@ static struct vfsmount *afs_mntpt_do_automount(struct dentry *mntpt) { struct afs_super_info *super; struct vfsmount *mnt; - struct page *page; + struct page *page = NULL; size_t size; - char *buf, *devname, *options; + char *buf, *devname = NULL, *options = NULL; int ret; _enter("{%s}", mntpt->d_name.name); @@ -150,22 +150,22 @@ static struct vfsmount *afs_mntpt_do_automount(struct dentry *mntpt) ret = -EINVAL; size = mntpt->d_inode->i_size; if (size > PAGE_SIZE - 1) - goto error_no_devname; + goto error; ret = -ENOMEM; devname = (char *) get_zeroed_page(GFP_KERNEL); if (!devname) - goto error_no_devname; + goto error; options = (char *) get_zeroed_page(GFP_KERNEL); if (!options) - goto error_no_options; + goto error; /* read the contents of the AFS special symlink */ page = read_mapping_page(mntpt->d_inode->i_mapping, 0, NULL); if (IS_ERR(page)) { ret = PTR_ERR(page); - goto error_no_page; + goto error; } ret = -EIO; @@ -196,12 +196,12 @@ static struct vfsmount *afs_mntpt_do_automount(struct dentry *mntpt) return mnt; error: - page_cache_release(page); -error_no_page: - free_page((unsigned long) options); -error_no_options: - free_page((unsigned long) devname); -error_no_devname: + if (page) + page_cache_release(page); + if (devname) + free_page((unsigned long) devname); + if (options) + free_page((unsigned long) options); _leave(" = %d", ret); return ERR_PTR(ret); } diff --git a/trunk/fs/ecryptfs/crypto.c b/trunk/fs/ecryptfs/crypto.c index 1cc087635a5e..efb2b9400391 100644 --- a/trunk/fs/ecryptfs/crypto.c +++ b/trunk/fs/ecryptfs/crypto.c @@ -382,8 +382,8 @@ static int encrypt_scatterlist(struct ecryptfs_crypt_stat *crypt_stat, static void ecryptfs_lower_offset_for_extent(loff_t *offset, loff_t extent_num, struct ecryptfs_crypt_stat *crypt_stat) { - (*offset) = ecryptfs_lower_header_size(crypt_stat) - + (crypt_stat->extent_size * extent_num); + (*offset) = (crypt_stat->num_header_bytes_at_front + + (crypt_stat->extent_size * extent_num)); } /** @@ -835,13 +835,13 @@ void ecryptfs_set_default_sizes(struct ecryptfs_crypt_stat *crypt_stat) set_extent_mask_and_shift(crypt_stat); crypt_stat->iv_bytes = ECRYPTFS_DEFAULT_IV_BYTES; if (crypt_stat->flags & ECRYPTFS_METADATA_IN_XATTR) - crypt_stat->metadata_size = ECRYPTFS_MINIMUM_HEADER_EXTENT_SIZE; + crypt_stat->num_header_bytes_at_front = 0; else { if (PAGE_CACHE_SIZE <= ECRYPTFS_MINIMUM_HEADER_EXTENT_SIZE) - crypt_stat->metadata_size = + crypt_stat->num_header_bytes_at_front = ECRYPTFS_MINIMUM_HEADER_EXTENT_SIZE; else - crypt_stat->metadata_size = PAGE_CACHE_SIZE; + crypt_stat->num_header_bytes_at_front = PAGE_CACHE_SIZE; } } @@ -1108,9 +1108,9 @@ static void write_ecryptfs_marker(char *page_virt, size_t *written) (*written) = MAGIC_ECRYPTFS_MARKER_SIZE_BYTES; } -void ecryptfs_write_crypt_stat_flags(char *page_virt, - struct ecryptfs_crypt_stat *crypt_stat, - size_t *written) +static void +write_ecryptfs_flags(char *page_virt, struct ecryptfs_crypt_stat *crypt_stat, + size_t *written) { u32 flags = 0; int i; @@ -1238,7 +1238,8 @@ ecryptfs_write_header_metadata(char *virt, header_extent_size = (u32)crypt_stat->extent_size; num_header_extents_at_front = - (u16)(crypt_stat->metadata_size / crypt_stat->extent_size); + (u16)(crypt_stat->num_header_bytes_at_front + / crypt_stat->extent_size); put_unaligned_be32(header_extent_size, virt); virt += 4; put_unaligned_be16(num_header_extents_at_front, virt); @@ -1291,8 +1292,7 @@ static int ecryptfs_write_headers_virt(char *page_virt, size_t max, offset = ECRYPTFS_FILE_SIZE_BYTES; write_ecryptfs_marker((page_virt + offset), &written); offset += written; - ecryptfs_write_crypt_stat_flags((page_virt + offset), crypt_stat, - &written); + write_ecryptfs_flags((page_virt + offset), crypt_stat, &written); offset += written; ecryptfs_write_header_metadata((page_virt + offset), crypt_stat, &written); @@ -1382,7 +1382,7 @@ int ecryptfs_write_metadata(struct dentry *ecryptfs_dentry) rc = -EINVAL; goto out; } - virt_len = crypt_stat->metadata_size; + virt_len = crypt_stat->num_header_bytes_at_front; order = get_order(virt_len); /* Released in this function */ virt = (char *)ecryptfs_get_zeroed_pages(GFP_KERNEL, order); @@ -1428,15 +1428,16 @@ static int parse_header_metadata(struct ecryptfs_crypt_stat *crypt_stat, header_extent_size = get_unaligned_be32(virt); virt += sizeof(__be32); num_header_extents_at_front = get_unaligned_be16(virt); - crypt_stat->metadata_size = (((size_t)num_header_extents_at_front - * (size_t)header_extent_size)); + crypt_stat->num_header_bytes_at_front = + (((size_t)num_header_extents_at_front + * (size_t)header_extent_size)); (*bytes_read) = (sizeof(__be32) + sizeof(__be16)); if ((validate_header_size == ECRYPTFS_VALIDATE_HEADER_SIZE) - && (crypt_stat->metadata_size + && (crypt_stat->num_header_bytes_at_front < ECRYPTFS_MINIMUM_HEADER_EXTENT_SIZE)) { rc = -EINVAL; printk(KERN_WARNING "Invalid header size: [%zd]\n", - crypt_stat->metadata_size); + crypt_stat->num_header_bytes_at_front); } return rc; } @@ -1451,7 +1452,8 @@ static int parse_header_metadata(struct ecryptfs_crypt_stat *crypt_stat, */ static void set_default_header_data(struct ecryptfs_crypt_stat *crypt_stat) { - crypt_stat->metadata_size = ECRYPTFS_MINIMUM_HEADER_EXTENT_SIZE; + crypt_stat->num_header_bytes_at_front = + ECRYPTFS_MINIMUM_HEADER_EXTENT_SIZE; } /** @@ -1605,7 +1607,6 @@ int ecryptfs_read_metadata(struct dentry *ecryptfs_dentry) ecryptfs_dentry, ECRYPTFS_VALIDATE_HEADER_SIZE); if (rc) { - memset(page_virt, 0, PAGE_CACHE_SIZE); rc = ecryptfs_read_xattr_region(page_virt, ecryptfs_inode); if (rc) { printk(KERN_DEBUG "Valid eCryptfs headers not found in " diff --git a/trunk/fs/ecryptfs/ecryptfs_kernel.h b/trunk/fs/ecryptfs/ecryptfs_kernel.h index bc7115403f38..542f625312f3 100644 --- a/trunk/fs/ecryptfs/ecryptfs_kernel.h +++ b/trunk/fs/ecryptfs/ecryptfs_kernel.h @@ -273,7 +273,7 @@ struct ecryptfs_crypt_stat { u32 flags; unsigned int file_version; size_t iv_bytes; - size_t metadata_size; + size_t num_header_bytes_at_front; size_t extent_size; /* Data extent size; default is 4096 */ size_t key_size; size_t extent_shift; @@ -464,14 +464,6 @@ struct ecryptfs_daemon { extern struct mutex ecryptfs_daemon_hash_mux; -static inline size_t -ecryptfs_lower_header_size(struct ecryptfs_crypt_stat *crypt_stat) -{ - if (crypt_stat->flags & ECRYPTFS_METADATA_IN_XATTR) - return 0; - return crypt_stat->metadata_size; -} - static inline struct ecryptfs_file_info * ecryptfs_file_to_private(struct file *file) { @@ -659,9 +651,6 @@ int ecryptfs_decrypt_page(struct page *page); int ecryptfs_write_metadata(struct dentry *ecryptfs_dentry); int ecryptfs_read_metadata(struct dentry *ecryptfs_dentry); int ecryptfs_new_file_context(struct dentry *ecryptfs_dentry); -void ecryptfs_write_crypt_stat_flags(char *page_virt, - struct ecryptfs_crypt_stat *crypt_stat, - size_t *written); int ecryptfs_read_and_validate_header_region(char *data, struct inode *ecryptfs_inode); int ecryptfs_read_and_validate_xattr_region(char *page_virt, diff --git a/trunk/fs/ecryptfs/inode.c b/trunk/fs/ecryptfs/inode.c index e2d4418affac..d3362faf3852 100644 --- a/trunk/fs/ecryptfs/inode.c +++ b/trunk/fs/ecryptfs/inode.c @@ -324,7 +324,6 @@ int ecryptfs_lookup_and_interpose_lower(struct dentry *ecryptfs_dentry, rc = ecryptfs_read_and_validate_header_region(page_virt, ecryptfs_dentry->d_inode); if (rc) { - memset(page_virt, 0, PAGE_CACHE_SIZE); rc = ecryptfs_read_and_validate_xattr_region(page_virt, ecryptfs_dentry); if (rc) { @@ -337,7 +336,7 @@ int ecryptfs_lookup_and_interpose_lower(struct dentry *ecryptfs_dentry, ecryptfs_dentry->d_sb)->mount_crypt_stat; if (mount_crypt_stat->flags & ECRYPTFS_ENCRYPTED_VIEW_ENABLED) { if (crypt_stat->flags & ECRYPTFS_METADATA_IN_XATTR) - file_size = (crypt_stat->metadata_size + file_size = (crypt_stat->num_header_bytes_at_front + i_size_read(lower_dentry->d_inode)); else file_size = i_size_read(lower_dentry->d_inode); @@ -389,9 +388,9 @@ static struct dentry *ecryptfs_lookup(struct inode *ecryptfs_dir_inode, mutex_unlock(&lower_dir_dentry->d_inode->i_mutex); if (IS_ERR(lower_dentry)) { rc = PTR_ERR(lower_dentry); - ecryptfs_printk(KERN_DEBUG, "%s: lookup_one_len() returned " - "[%d] on lower_dentry = [%s]\n", __func__, rc, - encrypted_and_encoded_name); + printk(KERN_ERR "%s: lookup_one_len() returned [%d] on " + "lower_dentry = [%s]\n", __func__, rc, + ecryptfs_dentry->d_name.name); goto out_d_drop; } if (lower_dentry->d_inode) @@ -418,9 +417,9 @@ static struct dentry *ecryptfs_lookup(struct inode *ecryptfs_dir_inode, mutex_unlock(&lower_dir_dentry->d_inode->i_mutex); if (IS_ERR(lower_dentry)) { rc = PTR_ERR(lower_dentry); - ecryptfs_printk(KERN_DEBUG, "%s: lookup_one_len() returned " - "[%d] on lower_dentry = [%s]\n", __func__, rc, - encrypted_and_encoded_name); + printk(KERN_ERR "%s: lookup_one_len() returned [%d] on " + "lower_dentry = [%s]\n", __func__, rc, + encrypted_and_encoded_name); goto out_d_drop; } lookup_and_interpose: @@ -457,8 +456,8 @@ static int ecryptfs_link(struct dentry *old_dentry, struct inode *dir, rc = ecryptfs_interpose(lower_new_dentry, new_dentry, dir->i_sb, 0); if (rc) goto out_lock; - fsstack_copy_attr_times(dir, lower_dir_dentry->d_inode); - fsstack_copy_inode_size(dir, lower_dir_dentry->d_inode); + fsstack_copy_attr_times(dir, lower_new_dentry->d_inode); + fsstack_copy_inode_size(dir, lower_new_dentry->d_inode); old_dentry->d_inode->i_nlink = ecryptfs_inode_to_lower(old_dentry->d_inode)->i_nlink; i_size_write(new_dentry->d_inode, file_size_save); @@ -649,17 +648,38 @@ ecryptfs_rename(struct inode *old_dir, struct dentry *old_dentry, return rc; } -static int ecryptfs_readlink_lower(struct dentry *dentry, char **buf, - size_t *bufsiz) +static int +ecryptfs_readlink(struct dentry *dentry, char __user *buf, int bufsiz) { - struct dentry *lower_dentry = ecryptfs_dentry_to_lower(dentry); char *lower_buf; - size_t lower_bufsiz = PATH_MAX; + size_t lower_bufsiz; + struct dentry *lower_dentry; + struct ecryptfs_mount_crypt_stat *mount_crypt_stat; + char *plaintext_name; + size_t plaintext_name_size; mm_segment_t old_fs; int rc; + lower_dentry = ecryptfs_dentry_to_lower(dentry); + if (!lower_dentry->d_inode->i_op->readlink) { + rc = -EINVAL; + goto out; + } + mount_crypt_stat = &ecryptfs_superblock_to_private( + dentry->d_sb)->mount_crypt_stat; + /* + * If the lower filename is encrypted, it will result in a significantly + * longer name. If needed, truncate the name after decode and decrypt. + */ + if (mount_crypt_stat->flags & ECRYPTFS_GLOBAL_ENCRYPT_FILENAMES) + lower_bufsiz = PATH_MAX; + else + lower_bufsiz = bufsiz; + /* Released in this function */ lower_buf = kmalloc(lower_bufsiz, GFP_KERNEL); - if (!lower_buf) { + if (lower_buf == NULL) { + printk(KERN_ERR "%s: Out of memory whilst attempting to " + "kmalloc [%zd] bytes\n", __func__, lower_bufsiz); rc = -ENOMEM; goto out; } @@ -669,31 +689,29 @@ static int ecryptfs_readlink_lower(struct dentry *dentry, char **buf, (char __user *)lower_buf, lower_bufsiz); set_fs(old_fs); - if (rc < 0) - goto out; - lower_bufsiz = rc; - rc = ecryptfs_decode_and_decrypt_filename(buf, bufsiz, dentry, - lower_buf, lower_bufsiz); -out: + if (rc >= 0) { + rc = ecryptfs_decode_and_decrypt_filename(&plaintext_name, + &plaintext_name_size, + dentry, lower_buf, + rc); + if (rc) { + printk(KERN_ERR "%s: Error attempting to decode and " + "decrypt filename; rc = [%d]\n", __func__, + rc); + goto out_free_lower_buf; + } + /* Check for bufsiz <= 0 done in sys_readlinkat() */ + rc = copy_to_user(buf, plaintext_name, + min((size_t) bufsiz, plaintext_name_size)); + if (rc) + rc = -EFAULT; + else + rc = plaintext_name_size; + kfree(plaintext_name); + fsstack_copy_attr_atime(dentry->d_inode, lower_dentry->d_inode); + } +out_free_lower_buf: kfree(lower_buf); - return rc; -} - -static int -ecryptfs_readlink(struct dentry *dentry, char __user *buf, int bufsiz) -{ - char *kbuf; - size_t kbufsiz, copied; - int rc; - - rc = ecryptfs_readlink_lower(dentry, &kbuf, &kbufsiz); - if (rc) - goto out; - copied = min_t(size_t, bufsiz, kbufsiz); - rc = copy_to_user(buf, kbuf, copied) ? -EFAULT : copied; - kfree(kbuf); - fsstack_copy_attr_atime(dentry->d_inode, - ecryptfs_dentry_to_lower(dentry)->d_inode); out: return rc; } @@ -751,7 +769,7 @@ upper_size_to_lower_size(struct ecryptfs_crypt_stat *crypt_stat, { loff_t lower_size; - lower_size = ecryptfs_lower_header_size(crypt_stat); + lower_size = crypt_stat->num_header_bytes_at_front; if (upper_size != 0) { loff_t num_extents; @@ -998,28 +1016,6 @@ static int ecryptfs_setattr(struct dentry *dentry, struct iattr *ia) return rc; } -int ecryptfs_getattr_link(struct vfsmount *mnt, struct dentry *dentry, - struct kstat *stat) -{ - struct ecryptfs_mount_crypt_stat *mount_crypt_stat; - int rc = 0; - - mount_crypt_stat = &ecryptfs_superblock_to_private( - dentry->d_sb)->mount_crypt_stat; - generic_fillattr(dentry->d_inode, stat); - if (mount_crypt_stat->flags & ECRYPTFS_GLOBAL_ENCRYPT_FILENAMES) { - char *target; - size_t targetsiz; - - rc = ecryptfs_readlink_lower(dentry, &target, &targetsiz); - if (!rc) { - kfree(target); - stat->size = targetsiz; - } - } - return rc; -} - int ecryptfs_getattr(struct vfsmount *mnt, struct dentry *dentry, struct kstat *stat) { @@ -1044,7 +1040,7 @@ ecryptfs_setxattr(struct dentry *dentry, const char *name, const void *value, lower_dentry = ecryptfs_dentry_to_lower(dentry); if (!lower_dentry->d_inode->i_op->setxattr) { - rc = -EOPNOTSUPP; + rc = -ENOSYS; goto out; } mutex_lock(&lower_dentry->d_inode->i_mutex); @@ -1062,7 +1058,7 @@ ecryptfs_getxattr_lower(struct dentry *lower_dentry, const char *name, int rc = 0; if (!lower_dentry->d_inode->i_op->getxattr) { - rc = -EOPNOTSUPP; + rc = -ENOSYS; goto out; } mutex_lock(&lower_dentry->d_inode->i_mutex); @@ -1089,7 +1085,7 @@ ecryptfs_listxattr(struct dentry *dentry, char *list, size_t size) lower_dentry = ecryptfs_dentry_to_lower(dentry); if (!lower_dentry->d_inode->i_op->listxattr) { - rc = -EOPNOTSUPP; + rc = -ENOSYS; goto out; } mutex_lock(&lower_dentry->d_inode->i_mutex); @@ -1106,7 +1102,7 @@ static int ecryptfs_removexattr(struct dentry *dentry, const char *name) lower_dentry = ecryptfs_dentry_to_lower(dentry); if (!lower_dentry->d_inode->i_op->removexattr) { - rc = -EOPNOTSUPP; + rc = -ENOSYS; goto out; } mutex_lock(&lower_dentry->d_inode->i_mutex); @@ -1137,7 +1133,6 @@ const struct inode_operations ecryptfs_symlink_iops = { .put_link = ecryptfs_put_link, .permission = ecryptfs_permission, .setattr = ecryptfs_setattr, - .getattr = ecryptfs_getattr_link, .setxattr = ecryptfs_setxattr, .getxattr = ecryptfs_getxattr, .listxattr = ecryptfs_listxattr, diff --git a/trunk/fs/ecryptfs/mmap.c b/trunk/fs/ecryptfs/mmap.c index 2ee9a3a7b68c..d491237c98e7 100644 --- a/trunk/fs/ecryptfs/mmap.c +++ b/trunk/fs/ecryptfs/mmap.c @@ -83,19 +83,6 @@ static int ecryptfs_writepage(struct page *page, struct writeback_control *wbc) return rc; } -static void strip_xattr_flag(char *page_virt, - struct ecryptfs_crypt_stat *crypt_stat) -{ - if (crypt_stat->flags & ECRYPTFS_METADATA_IN_XATTR) { - size_t written; - - crypt_stat->flags &= ~ECRYPTFS_METADATA_IN_XATTR; - ecryptfs_write_crypt_stat_flags(page_virt, crypt_stat, - &written); - crypt_stat->flags |= ECRYPTFS_METADATA_IN_XATTR; - } -} - /** * Header Extent: * Octets 0-7: Unencrypted file size (big-endian) @@ -111,6 +98,19 @@ static void strip_xattr_flag(char *page_virt, * (big-endian) * Octet 26: Begin RFC 2440 authentication token packet set */ +static void set_header_info(char *page_virt, + struct ecryptfs_crypt_stat *crypt_stat) +{ + size_t written; + size_t save_num_header_bytes_at_front = + crypt_stat->num_header_bytes_at_front; + + crypt_stat->num_header_bytes_at_front = + ECRYPTFS_MINIMUM_HEADER_EXTENT_SIZE; + ecryptfs_write_header_metadata(page_virt + 20, crypt_stat, &written); + crypt_stat->num_header_bytes_at_front = + save_num_header_bytes_at_front; +} /** * ecryptfs_copy_up_encrypted_with_header @@ -136,7 +136,8 @@ ecryptfs_copy_up_encrypted_with_header(struct page *page, * num_extents_per_page) + extent_num_in_page); size_t num_header_extents_at_front = - (crypt_stat->metadata_size / crypt_stat->extent_size); + (crypt_stat->num_header_bytes_at_front + / crypt_stat->extent_size); if (view_extent_num < num_header_extents_at_front) { /* This is a header extent */ @@ -146,14 +147,9 @@ ecryptfs_copy_up_encrypted_with_header(struct page *page, memset(page_virt, 0, PAGE_CACHE_SIZE); /* TODO: Support more than one header extent */ if (view_extent_num == 0) { - size_t written; - rc = ecryptfs_read_xattr_region( page_virt, page->mapping->host); - strip_xattr_flag(page_virt + 16, crypt_stat); - ecryptfs_write_header_metadata(page_virt + 20, - crypt_stat, - &written); + set_header_info(page_virt, crypt_stat); } kunmap_atomic(page_virt, KM_USER0); flush_dcache_page(page); @@ -166,7 +162,7 @@ ecryptfs_copy_up_encrypted_with_header(struct page *page, /* This is an encrypted data extent */ loff_t lower_offset = ((view_extent_num * crypt_stat->extent_size) - - crypt_stat->metadata_size); + - crypt_stat->num_header_bytes_at_front); rc = ecryptfs_read_lower_page_segment( page, (lower_offset >> PAGE_CACHE_SHIFT), diff --git a/trunk/fs/ecryptfs/super.c b/trunk/fs/ecryptfs/super.c index 278743c7716a..fcef41c1d2cf 100644 --- a/trunk/fs/ecryptfs/super.c +++ b/trunk/fs/ecryptfs/super.c @@ -86,6 +86,7 @@ static void ecryptfs_destroy_inode(struct inode *inode) if (lower_dentry->d_inode) { fput(inode_info->lower_file); inode_info->lower_file = NULL; + d_drop(lower_dentry); } } ecryptfs_destroy_crypt_stat(&inode_info->crypt_stat); diff --git a/trunk/fs/quota/Kconfig b/trunk/fs/quota/Kconfig index 3e21b1e2ad3a..dad7fb247ddc 100644 --- a/trunk/fs/quota/Kconfig +++ b/trunk/fs/quota/Kconfig @@ -33,14 +33,6 @@ config PRINT_QUOTA_WARNING Note that this behavior is currently deprecated and may go away in future. Please use notification via netlink socket instead. -config QUOTA_DEBUG - bool "Additional quota sanity checks" - depends on QUOTA - default n - help - If you say Y here, quota subsystem will perform some additional - sanity checks of quota internal structures. If unsure, say N. - # Generic support for tree structured quota files. Selected when needed. config QUOTA_TREE tristate diff --git a/trunk/fs/quota/dquot.c b/trunk/fs/quota/dquot.c index 788b5802a7ce..a0a9405b202a 100644 --- a/trunk/fs/quota/dquot.c +++ b/trunk/fs/quota/dquot.c @@ -80,6 +80,8 @@ #include +#define __DQUOT_PARANOIA + /* * There are three quota SMP locks. dq_list_lock protects all lists with quotas * and quota formats, dqstats structure containing statistics about the lists @@ -693,7 +695,7 @@ void dqput(struct dquot *dquot) if (!dquot) return; -#ifdef CONFIG_QUOTA_DEBUG +#ifdef __DQUOT_PARANOIA if (!atomic_read(&dquot->dq_count)) { printk("VFS: dqput: trying to free free dquot\n"); printk("VFS: device %s, dquot of %s %d\n", @@ -746,7 +748,7 @@ void dqput(struct dquot *dquot) goto we_slept; } atomic_dec(&dquot->dq_count); -#ifdef CONFIG_QUOTA_DEBUG +#ifdef __DQUOT_PARANOIA /* sanity check */ BUG_ON(!list_empty(&dquot->dq_free)); #endif @@ -843,7 +845,7 @@ struct dquot *dqget(struct super_block *sb, unsigned int id, int type) dquot = NULL; goto out; } -#ifdef CONFIG_QUOTA_DEBUG +#ifdef __DQUOT_PARANOIA BUG_ON(!dquot->dq_sb); /* Has somebody invalidated entry under us? */ #endif out: @@ -872,7 +874,7 @@ static int dqinit_needed(struct inode *inode, int type) static void add_dquot_ref(struct super_block *sb, int type) { struct inode *inode, *old_inode = NULL; -#ifdef CONFIG_QUOTA_DEBUG +#ifdef __DQUOT_PARANOIA int reserved = 0; #endif @@ -880,7 +882,7 @@ static void add_dquot_ref(struct super_block *sb, int type) list_for_each_entry(inode, &sb->s_inodes, i_sb_list) { if (inode->i_state & (I_FREEING|I_CLEAR|I_WILL_FREE|I_NEW)) continue; -#ifdef CONFIG_QUOTA_DEBUG +#ifdef __DQUOT_PARANOIA if (unlikely(inode_get_rsv_space(inode) > 0)) reserved = 1; #endif @@ -905,7 +907,7 @@ static void add_dquot_ref(struct super_block *sb, int type) spin_unlock(&inode_lock); iput(old_inode); -#ifdef CONFIG_QUOTA_DEBUG +#ifdef __DQUOT_PARANOIA if (reserved) { printk(KERN_WARNING "VFS (%s): Writes happened before quota" " was turned on thus quota information is probably " @@ -938,7 +940,7 @@ static int remove_inode_dquot_ref(struct inode *inode, int type, inode->i_dquot[type] = NULL; if (dquot) { if (dqput_blocks(dquot)) { -#ifdef CONFIG_QUOTA_DEBUG +#ifdef __DQUOT_PARANOIA if (atomic_read(&dquot->dq_count) != 1) printk(KERN_WARNING "VFS: Adding dquot with dq_count %d to dispose list.\n", atomic_read(&dquot->dq_count)); #endif diff --git a/trunk/mm/rmap.c b/trunk/mm/rmap.c index 526704e8215d..4bad3267537a 100644 --- a/trunk/mm/rmap.c +++ b/trunk/mm/rmap.c @@ -730,28 +730,23 @@ void page_move_anon_rmap(struct page *page, * @page: the page to add the mapping to * @vma: the vm area in which the mapping is added * @address: the user virtual address mapped - * @exclusive: the page is exclusively owned by the current process */ static void __page_set_anon_rmap(struct page *page, - struct vm_area_struct *vma, unsigned long address, int exclusive) + struct vm_area_struct *vma, unsigned long address) { - struct anon_vma *anon_vma = vma->anon_vma; + struct anon_vma_chain *avc; + struct anon_vma *anon_vma; - BUG_ON(!anon_vma); + BUG_ON(!vma->anon_vma); /* - * If the page isn't exclusively mapped into this vma, - * we must use the _oldest_ possible anon_vma for the - * page mapping! + * We must use the _oldest_ possible anon_vma for the page mapping! * - * So take the last AVC chain entry in the vma, which is - * the deepest ancestor, and use the anon_vma from that. + * So take the last AVC chain entry in the vma, which is the deepest + * ancestor, and use the anon_vma from that. */ - if (!exclusive) { - struct anon_vma_chain *avc; - avc = list_entry(vma->anon_vma_chain.prev, struct anon_vma_chain, same_vma); - anon_vma = avc->anon_vma; - } + avc = list_entry(vma->anon_vma_chain.prev, struct anon_vma_chain, same_vma); + anon_vma = avc->anon_vma; anon_vma = (void *) anon_vma + PAGE_MAPPING_ANON; page->mapping = (struct address_space *) anon_vma; @@ -807,7 +802,7 @@ void page_add_anon_rmap(struct page *page, VM_BUG_ON(!PageLocked(page)); VM_BUG_ON(address < vma->vm_start || address >= vma->vm_end); if (first) - __page_set_anon_rmap(page, vma, address, 0); + __page_set_anon_rmap(page, vma, address); else __page_check_anon_rmap(page, vma, address); } @@ -829,7 +824,7 @@ void page_add_new_anon_rmap(struct page *page, SetPageSwapBacked(page); atomic_set(&page->_mapcount, 0); /* increment count (starts at -1) */ __inc_zone_page_state(page, NR_ANON_PAGES); - __page_set_anon_rmap(page, vma, address, 1); + __page_set_anon_rmap(page, vma, address); if (page_evictable(page, vma)) lru_cache_add_lru(page, LRU_ACTIVE_ANON); else