Merge tag 'v3.10.76' into update
This is the 3.10.76 stable release
This commit is contained in:
@@ -1,6 +1,6 @@
|
||||
VERSION = 3
|
||||
PATCHLEVEL = 10
|
||||
SUBLEVEL = 75
|
||||
SUBLEVEL = 76
|
||||
EXTRAVERSION =
|
||||
NAME = TOSSUG Baby Fish
|
||||
|
||||
|
||||
@@ -156,6 +156,8 @@ retry:
|
||||
if (unlikely(fault & VM_FAULT_ERROR)) {
|
||||
if (fault & VM_FAULT_OOM)
|
||||
goto out_of_memory;
|
||||
else if (fault & VM_FAULT_SIGSEGV)
|
||||
goto bad_area;
|
||||
else if (fault & VM_FAULT_SIGBUS)
|
||||
goto do_sigbus;
|
||||
BUG();
|
||||
|
||||
@@ -160,6 +160,8 @@ good_area:
|
||||
/* TBD: switch to pagefault_out_of_memory() */
|
||||
if (fault & VM_FAULT_OOM)
|
||||
goto out_of_memory;
|
||||
else if (fault & VM_FAULT_SIGSEGV)
|
||||
goto bad_area;
|
||||
else if (fault & VM_FAULT_SIGBUS)
|
||||
goto do_sigbus;
|
||||
|
||||
|
||||
@@ -142,6 +142,8 @@ good_area:
|
||||
if (unlikely(fault & VM_FAULT_ERROR)) {
|
||||
if (fault & VM_FAULT_OOM)
|
||||
goto out_of_memory;
|
||||
else if (fault & VM_FAULT_SIGSEGV)
|
||||
goto bad_area;
|
||||
else if (fault & VM_FAULT_SIGBUS)
|
||||
goto do_sigbus;
|
||||
BUG();
|
||||
|
||||
@@ -176,6 +176,8 @@ retry:
|
||||
if (unlikely(fault & VM_FAULT_ERROR)) {
|
||||
if (fault & VM_FAULT_OOM)
|
||||
goto out_of_memory;
|
||||
else if (fault & VM_FAULT_SIGSEGV)
|
||||
goto bad_area;
|
||||
else if (fault & VM_FAULT_SIGBUS)
|
||||
goto do_sigbus;
|
||||
BUG();
|
||||
|
||||
@@ -168,6 +168,8 @@ asmlinkage void do_page_fault(int datammu, unsigned long esr0, unsigned long ear
|
||||
if (unlikely(fault & VM_FAULT_ERROR)) {
|
||||
if (fault & VM_FAULT_OOM)
|
||||
goto out_of_memory;
|
||||
else if (fault & VM_FAULT_SIGSEGV)
|
||||
goto bad_area;
|
||||
else if (fault & VM_FAULT_SIGBUS)
|
||||
goto do_sigbus;
|
||||
BUG();
|
||||
|
||||
@@ -172,6 +172,8 @@ retry:
|
||||
*/
|
||||
if (fault & VM_FAULT_OOM) {
|
||||
goto out_of_memory;
|
||||
} else if (fault & VM_FAULT_SIGSEGV) {
|
||||
goto bad_area;
|
||||
} else if (fault & VM_FAULT_SIGBUS) {
|
||||
signal = SIGBUS;
|
||||
goto bad_area;
|
||||
|
||||
@@ -200,6 +200,8 @@ good_area:
|
||||
if (unlikely(fault & VM_FAULT_ERROR)) {
|
||||
if (fault & VM_FAULT_OOM)
|
||||
goto out_of_memory;
|
||||
else if (fault & VM_FAULT_SIGSEGV)
|
||||
goto bad_area;
|
||||
else if (fault & VM_FAULT_SIGBUS)
|
||||
goto do_sigbus;
|
||||
BUG();
|
||||
|
||||
@@ -153,6 +153,8 @@ good_area:
|
||||
if (unlikely(fault & VM_FAULT_ERROR)) {
|
||||
if (fault & VM_FAULT_OOM)
|
||||
goto out_of_memory;
|
||||
else if (fault & VM_FAULT_SIGSEGV)
|
||||
goto map_err;
|
||||
else if (fault & VM_FAULT_SIGBUS)
|
||||
goto bus_err;
|
||||
BUG();
|
||||
|
||||
@@ -141,6 +141,8 @@ good_area:
|
||||
if (unlikely(fault & VM_FAULT_ERROR)) {
|
||||
if (fault & VM_FAULT_OOM)
|
||||
goto out_of_memory;
|
||||
else if (fault & VM_FAULT_SIGSEGV)
|
||||
goto bad_area;
|
||||
else if (fault & VM_FAULT_SIGBUS)
|
||||
goto do_sigbus;
|
||||
BUG();
|
||||
|
||||
@@ -224,6 +224,8 @@ good_area:
|
||||
if (unlikely(fault & VM_FAULT_ERROR)) {
|
||||
if (fault & VM_FAULT_OOM)
|
||||
goto out_of_memory;
|
||||
else if (fault & VM_FAULT_SIGSEGV)
|
||||
goto bad_area;
|
||||
else if (fault & VM_FAULT_SIGBUS)
|
||||
goto do_sigbus;
|
||||
BUG();
|
||||
|
||||
@@ -157,6 +157,8 @@ good_area:
|
||||
if (unlikely(fault & VM_FAULT_ERROR)) {
|
||||
if (fault & VM_FAULT_OOM)
|
||||
goto out_of_memory;
|
||||
else if (fault & VM_FAULT_SIGSEGV)
|
||||
goto bad_area;
|
||||
else if (fault & VM_FAULT_SIGBUS)
|
||||
goto do_sigbus;
|
||||
BUG();
|
||||
|
||||
@@ -262,6 +262,8 @@ good_area:
|
||||
if (unlikely(fault & VM_FAULT_ERROR)) {
|
||||
if (fault & VM_FAULT_OOM)
|
||||
goto out_of_memory;
|
||||
else if (fault & VM_FAULT_SIGSEGV)
|
||||
goto bad_area;
|
||||
else if (fault & VM_FAULT_SIGBUS)
|
||||
goto do_sigbus;
|
||||
BUG();
|
||||
|
||||
@@ -171,6 +171,8 @@ good_area:
|
||||
if (unlikely(fault & VM_FAULT_ERROR)) {
|
||||
if (fault & VM_FAULT_OOM)
|
||||
goto out_of_memory;
|
||||
else if (fault & VM_FAULT_SIGSEGV)
|
||||
goto bad_area;
|
||||
else if (fault & VM_FAULT_SIGBUS)
|
||||
goto do_sigbus;
|
||||
BUG();
|
||||
|
||||
@@ -220,6 +220,8 @@ good_area:
|
||||
*/
|
||||
if (fault & VM_FAULT_OOM)
|
||||
goto out_of_memory;
|
||||
else if (fault & VM_FAULT_SIGSEGV)
|
||||
goto bad_area;
|
||||
else if (fault & VM_FAULT_SIGBUS)
|
||||
goto bad_area;
|
||||
BUG();
|
||||
|
||||
@@ -425,6 +425,8 @@ good_area:
|
||||
*/
|
||||
fault = handle_mm_fault(mm, vma, address, flags);
|
||||
if (unlikely(fault & (VM_FAULT_RETRY|VM_FAULT_ERROR))) {
|
||||
if (fault & VM_FAULT_SIGSEGV)
|
||||
goto bad_area;
|
||||
rc = mm_fault_error(regs, address, fault);
|
||||
if (rc >= MM_FAULT_RETURN)
|
||||
goto bail;
|
||||
|
||||
@@ -75,7 +75,7 @@ int spu_handle_mm_fault(struct mm_struct *mm, unsigned long ea,
|
||||
if (*flt & VM_FAULT_OOM) {
|
||||
ret = -ENOMEM;
|
||||
goto out_unlock;
|
||||
} else if (*flt & VM_FAULT_SIGBUS) {
|
||||
} else if (*flt & (VM_FAULT_SIGBUS | VM_FAULT_SIGSEGV)) {
|
||||
ret = -EFAULT;
|
||||
goto out_unlock;
|
||||
}
|
||||
|
||||
@@ -164,7 +164,7 @@ static void spufs_prune_dir(struct dentry *dir)
|
||||
struct dentry *dentry, *tmp;
|
||||
|
||||
mutex_lock(&dir->d_inode->i_mutex);
|
||||
list_for_each_entry_safe(dentry, tmp, &dir->d_subdirs, d_u.d_child) {
|
||||
list_for_each_entry_safe(dentry, tmp, &dir->d_subdirs, d_child) {
|
||||
spin_lock(&dentry->d_lock);
|
||||
if (!(d_unhashed(dentry)) && dentry->d_inode) {
|
||||
dget_dlock(dentry);
|
||||
|
||||
@@ -244,6 +244,12 @@ static noinline void do_fault_error(struct pt_regs *regs, int fault)
|
||||
do_no_context(regs);
|
||||
else
|
||||
pagefault_out_of_memory();
|
||||
} else if (fault & VM_FAULT_SIGSEGV) {
|
||||
/* Kernel mode? Handle exceptions or die */
|
||||
if (!user_mode(regs))
|
||||
do_no_context(regs);
|
||||
else
|
||||
do_sigsegv(regs, SEGV_MAPERR);
|
||||
} else if (fault & VM_FAULT_SIGBUS) {
|
||||
/* Kernel mode? Handle exceptions or die */
|
||||
if (!user_mode(regs))
|
||||
|
||||
@@ -114,6 +114,8 @@ good_area:
|
||||
if (unlikely(fault & VM_FAULT_ERROR)) {
|
||||
if (fault & VM_FAULT_OOM)
|
||||
goto out_of_memory;
|
||||
else if (fault & VM_FAULT_SIGSEGV)
|
||||
goto bad_area;
|
||||
else if (fault & VM_FAULT_SIGBUS)
|
||||
goto do_sigbus;
|
||||
BUG();
|
||||
|
||||
@@ -353,6 +353,8 @@ mm_fault_error(struct pt_regs *regs, unsigned long error_code,
|
||||
} else {
|
||||
if (fault & VM_FAULT_SIGBUS)
|
||||
do_sigbus(regs, error_code, address);
|
||||
else if (fault & VM_FAULT_SIGSEGV)
|
||||
bad_area(regs, error_code, address);
|
||||
else
|
||||
BUG();
|
||||
}
|
||||
|
||||
@@ -252,6 +252,8 @@ good_area:
|
||||
if (unlikely(fault & VM_FAULT_ERROR)) {
|
||||
if (fault & VM_FAULT_OOM)
|
||||
goto out_of_memory;
|
||||
else if (fault & VM_FAULT_SIGSEGV)
|
||||
goto bad_area;
|
||||
else if (fault & VM_FAULT_SIGBUS)
|
||||
goto do_sigbus;
|
||||
BUG();
|
||||
|
||||
@@ -443,6 +443,8 @@ good_area:
|
||||
if (unlikely(fault & VM_FAULT_ERROR)) {
|
||||
if (fault & VM_FAULT_OOM)
|
||||
goto out_of_memory;
|
||||
else if (fault & VM_FAULT_SIGSEGV)
|
||||
goto bad_area;
|
||||
else if (fault & VM_FAULT_SIGBUS)
|
||||
goto do_sigbus;
|
||||
BUG();
|
||||
|
||||
@@ -446,6 +446,8 @@ good_area:
|
||||
if (unlikely(fault & VM_FAULT_ERROR)) {
|
||||
if (fault & VM_FAULT_OOM)
|
||||
goto out_of_memory;
|
||||
else if (fault & VM_FAULT_SIGSEGV)
|
||||
goto bad_area;
|
||||
else if (fault & VM_FAULT_SIGBUS)
|
||||
goto do_sigbus;
|
||||
BUG();
|
||||
|
||||
@@ -80,6 +80,8 @@ good_area:
|
||||
if (unlikely(fault & VM_FAULT_ERROR)) {
|
||||
if (fault & VM_FAULT_OOM) {
|
||||
goto out_of_memory;
|
||||
} else if (fault & VM_FAULT_SIGSEGV) {
|
||||
goto out;
|
||||
} else if (fault & VM_FAULT_SIGBUS) {
|
||||
err = -EACCES;
|
||||
goto out;
|
||||
|
||||
+8
-19
@@ -2450,7 +2450,7 @@ static int em_sysenter(struct x86_emulate_ctxt *ctxt)
|
||||
* Not recognized on AMD in compat mode (but is recognized in legacy
|
||||
* mode).
|
||||
*/
|
||||
if ((ctxt->mode == X86EMUL_MODE_PROT32) && (efer & EFER_LMA)
|
||||
if ((ctxt->mode != X86EMUL_MODE_PROT64) && (efer & EFER_LMA)
|
||||
&& !vendor_intel(ctxt))
|
||||
return emulate_ud(ctxt);
|
||||
|
||||
@@ -2463,25 +2463,13 @@ static int em_sysenter(struct x86_emulate_ctxt *ctxt)
|
||||
setup_syscalls_segments(ctxt, &cs, &ss);
|
||||
|
||||
ops->get_msr(ctxt, MSR_IA32_SYSENTER_CS, &msr_data);
|
||||
switch (ctxt->mode) {
|
||||
case X86EMUL_MODE_PROT32:
|
||||
if ((msr_data & 0xfffc) == 0x0)
|
||||
return emulate_gp(ctxt, 0);
|
||||
break;
|
||||
case X86EMUL_MODE_PROT64:
|
||||
if (msr_data == 0x0)
|
||||
return emulate_gp(ctxt, 0);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
if ((msr_data & 0xfffc) == 0x0)
|
||||
return emulate_gp(ctxt, 0);
|
||||
|
||||
ctxt->eflags &= ~(EFLG_VM | EFLG_IF | EFLG_RF);
|
||||
cs_sel = (u16)msr_data;
|
||||
cs_sel &= ~SELECTOR_RPL_MASK;
|
||||
cs_sel = (u16)msr_data & ~SELECTOR_RPL_MASK;
|
||||
ss_sel = cs_sel + 8;
|
||||
ss_sel &= ~SELECTOR_RPL_MASK;
|
||||
if (ctxt->mode == X86EMUL_MODE_PROT64 || (efer & EFER_LMA)) {
|
||||
if (efer & EFER_LMA) {
|
||||
cs.d = 0;
|
||||
cs.l = 1;
|
||||
}
|
||||
@@ -2490,10 +2478,11 @@ static int em_sysenter(struct x86_emulate_ctxt *ctxt)
|
||||
ops->set_segment(ctxt, ss_sel, &ss, 0, VCPU_SREG_SS);
|
||||
|
||||
ops->get_msr(ctxt, MSR_IA32_SYSENTER_EIP, &msr_data);
|
||||
ctxt->_eip = msr_data;
|
||||
ctxt->_eip = (efer & EFER_LMA) ? msr_data : (u32)msr_data;
|
||||
|
||||
ops->get_msr(ctxt, MSR_IA32_SYSENTER_ESP, &msr_data);
|
||||
*reg_write(ctxt, VCPU_REGS_RSP) = msr_data;
|
||||
*reg_write(ctxt, VCPU_REGS_RSP) = (efer & EFER_LMA) ? msr_data :
|
||||
(u32)msr_data;
|
||||
|
||||
return X86EMUL_CONTINUE;
|
||||
}
|
||||
|
||||
+3
-7
@@ -812,11 +812,8 @@ do_sigbus(struct pt_regs *regs, unsigned long error_code, unsigned long address,
|
||||
unsigned int fault)
|
||||
{
|
||||
struct task_struct *tsk = current;
|
||||
struct mm_struct *mm = tsk->mm;
|
||||
int code = BUS_ADRERR;
|
||||
|
||||
up_read(&mm->mmap_sem);
|
||||
|
||||
/* Kernel mode? Handle exceptions or die: */
|
||||
if (!(error_code & PF_USER)) {
|
||||
no_context(regs, error_code, address, SIGBUS, BUS_ADRERR);
|
||||
@@ -847,7 +844,6 @@ mm_fault_error(struct pt_regs *regs, unsigned long error_code,
|
||||
unsigned long address, unsigned int fault)
|
||||
{
|
||||
if (fatal_signal_pending(current) && !(error_code & PF_USER)) {
|
||||
up_read(¤t->mm->mmap_sem);
|
||||
no_context(regs, error_code, address, 0, 0);
|
||||
return;
|
||||
}
|
||||
@@ -855,14 +851,11 @@ mm_fault_error(struct pt_regs *regs, unsigned long error_code,
|
||||
if (fault & VM_FAULT_OOM) {
|
||||
/* Kernel mode? Handle exceptions or die: */
|
||||
if (!(error_code & PF_USER)) {
|
||||
up_read(¤t->mm->mmap_sem);
|
||||
no_context(regs, error_code, address,
|
||||
SIGSEGV, SEGV_MAPERR);
|
||||
return;
|
||||
}
|
||||
|
||||
up_read(¤t->mm->mmap_sem);
|
||||
|
||||
/*
|
||||
* We ran out of memory, call the OOM killer, and return the
|
||||
* userspace (which will retry the fault, or kill us if we got
|
||||
@@ -873,6 +866,8 @@ mm_fault_error(struct pt_regs *regs, unsigned long error_code,
|
||||
if (fault & (VM_FAULT_SIGBUS|VM_FAULT_HWPOISON|
|
||||
VM_FAULT_HWPOISON_LARGE))
|
||||
do_sigbus(regs, error_code, address, fault);
|
||||
else if (fault & VM_FAULT_SIGSEGV)
|
||||
bad_area_nosemaphore(regs, error_code, address);
|
||||
else
|
||||
BUG();
|
||||
}
|
||||
@@ -1193,6 +1188,7 @@ good_area:
|
||||
return;
|
||||
|
||||
if (unlikely(fault & VM_FAULT_ERROR)) {
|
||||
up_read(&mm->mmap_sem);
|
||||
mm_fault_error(regs, error_code, address, fault);
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -117,6 +117,8 @@ good_area:
|
||||
if (unlikely(fault & VM_FAULT_ERROR)) {
|
||||
if (fault & VM_FAULT_OOM)
|
||||
goto out_of_memory;
|
||||
else if (fault & VM_FAULT_SIGSEGV)
|
||||
goto bad_area;
|
||||
else if (fault & VM_FAULT_SIGBUS)
|
||||
goto do_sigbus;
|
||||
BUG();
|
||||
|
||||
@@ -77,6 +77,8 @@ static struct usb_device_id ath3k_table[] = {
|
||||
{ USB_DEVICE(0x0CF3, 0x3004) },
|
||||
{ USB_DEVICE(0x0CF3, 0x3008) },
|
||||
{ USB_DEVICE(0x0CF3, 0x311D) },
|
||||
{ USB_DEVICE(0x0CF3, 0x311E) },
|
||||
{ USB_DEVICE(0x0CF3, 0x311F) },
|
||||
{ USB_DEVICE(0x0CF3, 0x817a) },
|
||||
{ USB_DEVICE(0x13d3, 0x3375) },
|
||||
{ USB_DEVICE(0x04CA, 0x3004) },
|
||||
@@ -120,6 +122,8 @@ static struct usb_device_id ath3k_blist_tbl[] = {
|
||||
{ USB_DEVICE(0x0cf3, 0x3004), .driver_info = BTUSB_ATH3012 },
|
||||
{ USB_DEVICE(0x0cf3, 0x3008), .driver_info = BTUSB_ATH3012 },
|
||||
{ USB_DEVICE(0x0cf3, 0x311D), .driver_info = BTUSB_ATH3012 },
|
||||
{ USB_DEVICE(0x0cf3, 0x311E), .driver_info = BTUSB_ATH3012 },
|
||||
{ USB_DEVICE(0x0cf3, 0x311F), .driver_info = BTUSB_ATH3012 },
|
||||
{ USB_DEVICE(0x0CF3, 0x817a), .driver_info = BTUSB_ATH3012 },
|
||||
{ USB_DEVICE(0x13d3, 0x3375), .driver_info = BTUSB_ATH3012 },
|
||||
{ USB_DEVICE(0x04ca, 0x3004), .driver_info = BTUSB_ATH3012 },
|
||||
|
||||
@@ -49,6 +49,7 @@ static struct usb_driver btusb_driver;
|
||||
#define BTUSB_WRONG_SCO_MTU 0x40
|
||||
#define BTUSB_ATH3012 0x80
|
||||
#define BTUSB_INTEL 0x100
|
||||
#define BTUSB_INTEL_BOOT 0x200
|
||||
|
||||
static struct usb_device_id btusb_table[] = {
|
||||
/* Generic Bluetooth USB device */
|
||||
@@ -113,6 +114,13 @@ static struct usb_device_id btusb_table[] = {
|
||||
/*Broadcom devices with vendor specific id */
|
||||
{ USB_VENDOR_AND_INTERFACE_INFO(0x0a5c, 0xff, 0x01, 0x01) },
|
||||
|
||||
/* IMC Networks - Broadcom based */
|
||||
{ USB_VENDOR_AND_INTERFACE_INFO(0x13d3, 0xff, 0x01, 0x01) },
|
||||
|
||||
/* Intel Bluetooth USB Bootloader (RAM module) */
|
||||
{ USB_DEVICE(0x8087, 0x0a5a),
|
||||
.driver_info = BTUSB_INTEL_BOOT | BTUSB_BROKEN_ISOC },
|
||||
|
||||
{ } /* Terminating entry */
|
||||
};
|
||||
|
||||
@@ -141,6 +149,8 @@ static struct usb_device_id blacklist_table[] = {
|
||||
{ USB_DEVICE(0x0cf3, 0x3004), .driver_info = BTUSB_ATH3012 },
|
||||
{ USB_DEVICE(0x0cf3, 0x3008), .driver_info = BTUSB_ATH3012 },
|
||||
{ USB_DEVICE(0x0cf3, 0x311d), .driver_info = BTUSB_ATH3012 },
|
||||
{ USB_DEVICE(0x0cf3, 0x311e), .driver_info = BTUSB_ATH3012 },
|
||||
{ USB_DEVICE(0x0cf3, 0x311f), .driver_info = BTUSB_ATH3012 },
|
||||
{ USB_DEVICE(0x0cf3, 0x817a), .driver_info = BTUSB_ATH3012 },
|
||||
{ USB_DEVICE(0x13d3, 0x3375), .driver_info = BTUSB_ATH3012 },
|
||||
{ USB_DEVICE(0x04ca, 0x3004), .driver_info = BTUSB_ATH3012 },
|
||||
@@ -1444,6 +1454,9 @@ static int btusb_probe(struct usb_interface *intf,
|
||||
if (id->driver_info & BTUSB_INTEL)
|
||||
hdev->setup = btusb_setup_intel;
|
||||
|
||||
if (id->driver_info & BTUSB_INTEL_BOOT)
|
||||
set_bit(HCI_QUIRK_RAW_DEVICE, &hdev->quirks);
|
||||
|
||||
/* Interface numbers are hardcoded in the specification */
|
||||
data->isoc = usb_ifnum_to_if(data->udev, 1);
|
||||
|
||||
|
||||
@@ -270,8 +270,9 @@ static const u32 correrrthrsld[] = {
|
||||
* sbridge structs
|
||||
*/
|
||||
|
||||
#define NUM_CHANNELS 4
|
||||
#define MAX_DIMMS 3 /* Max DIMMS per channel */
|
||||
#define NUM_CHANNELS 4
|
||||
#define MAX_DIMMS 3 /* Max DIMMS per channel */
|
||||
#define CHANNEL_UNSPECIFIED 0xf /* Intel IA32 SDM 15-14 */
|
||||
|
||||
struct sbridge_info {
|
||||
u32 mcmtr;
|
||||
@@ -1451,6 +1452,9 @@ static void sbridge_mce_output_error(struct mem_ctl_info *mci,
|
||||
|
||||
/* FIXME: need support for channel mask */
|
||||
|
||||
if (channel == CHANNEL_UNSPECIFIED)
|
||||
channel = -1;
|
||||
|
||||
/* Call the helper to output message */
|
||||
edac_mc_handle_error(tp_event, mci, core_err_cnt,
|
||||
m->addr >> PAGE_SHIFT, m->addr & ~PAGE_MASK, 0,
|
||||
|
||||
@@ -2869,7 +2869,7 @@ bnx2_tx_int(struct bnx2 *bp, struct bnx2_napi *bnapi, int budget)
|
||||
sw_cons = BNX2_NEXT_TX_BD(sw_cons);
|
||||
|
||||
tx_bytes += skb->len;
|
||||
dev_kfree_skb(skb);
|
||||
dev_kfree_skb_any(skb);
|
||||
tx_pkt++;
|
||||
if (tx_pkt == budget)
|
||||
break;
|
||||
@@ -6610,7 +6610,7 @@ bnx2_start_xmit(struct sk_buff *skb, struct net_device *dev)
|
||||
|
||||
mapping = dma_map_single(&bp->pdev->dev, skb->data, len, PCI_DMA_TODEVICE);
|
||||
if (dma_mapping_error(&bp->pdev->dev, mapping)) {
|
||||
dev_kfree_skb(skb);
|
||||
dev_kfree_skb_any(skb);
|
||||
return NETDEV_TX_OK;
|
||||
}
|
||||
|
||||
@@ -6703,7 +6703,7 @@ dma_error:
|
||||
PCI_DMA_TODEVICE);
|
||||
}
|
||||
|
||||
dev_kfree_skb(skb);
|
||||
dev_kfree_skb_any(skb);
|
||||
return NETDEV_TX_OK;
|
||||
}
|
||||
|
||||
|
||||
@@ -6437,7 +6437,7 @@ static void tg3_tx(struct tg3_napi *tnapi)
|
||||
pkts_compl++;
|
||||
bytes_compl += skb->len;
|
||||
|
||||
dev_kfree_skb(skb);
|
||||
dev_kfree_skb_any(skb);
|
||||
|
||||
if (unlikely(tx_bug)) {
|
||||
tg3_tx_recover(tp);
|
||||
@@ -6769,7 +6769,7 @@ static int tg3_rx(struct tg3_napi *tnapi, int budget)
|
||||
if (len > (tp->dev->mtu + ETH_HLEN) &&
|
||||
skb->protocol != htons(ETH_P_8021Q) &&
|
||||
skb->protocol != htons(ETH_P_8021AD)) {
|
||||
dev_kfree_skb(skb);
|
||||
dev_kfree_skb_any(skb);
|
||||
goto drop_it_no_recycle;
|
||||
}
|
||||
|
||||
@@ -7652,7 +7652,7 @@ static int tigon3_dma_hwbug_workaround(struct tg3_napi *tnapi,
|
||||
PCI_DMA_TODEVICE);
|
||||
/* Make sure the mapping succeeded */
|
||||
if (pci_dma_mapping_error(tp->pdev, new_addr)) {
|
||||
dev_kfree_skb(new_skb);
|
||||
dev_kfree_skb_any(new_skb);
|
||||
ret = -1;
|
||||
} else {
|
||||
u32 save_entry = *entry;
|
||||
@@ -7667,13 +7667,13 @@ static int tigon3_dma_hwbug_workaround(struct tg3_napi *tnapi,
|
||||
new_skb->len, base_flags,
|
||||
mss, vlan)) {
|
||||
tg3_tx_skb_unmap(tnapi, save_entry, -1);
|
||||
dev_kfree_skb(new_skb);
|
||||
dev_kfree_skb_any(new_skb);
|
||||
ret = -1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
dev_kfree_skb(skb);
|
||||
dev_kfree_skb_any(skb);
|
||||
*pskb = new_skb;
|
||||
return ret;
|
||||
}
|
||||
@@ -7716,7 +7716,7 @@ static int tg3_tso_bug(struct tg3 *tp, struct sk_buff *skb)
|
||||
} while (segs);
|
||||
|
||||
tg3_tso_bug_end:
|
||||
dev_kfree_skb(skb);
|
||||
dev_kfree_skb_any(skb);
|
||||
|
||||
return NETDEV_TX_OK;
|
||||
}
|
||||
@@ -7954,7 +7954,7 @@ dma_error:
|
||||
tg3_tx_skb_unmap(tnapi, tnapi->tx_prod, --i);
|
||||
tnapi->tx_buffers[tnapi->tx_prod].skb = NULL;
|
||||
drop:
|
||||
dev_kfree_skb(skb);
|
||||
dev_kfree_skb_any(skb);
|
||||
drop_nofree:
|
||||
tp->tx_dropped++;
|
||||
return NETDEV_TX_OK;
|
||||
|
||||
@@ -1767,7 +1767,7 @@ static u16 be_tx_compl_process(struct be_adapter *adapter,
|
||||
queue_tail_inc(txq);
|
||||
} while (cur_index != last_index);
|
||||
|
||||
kfree_skb(sent_skb);
|
||||
dev_kfree_skb_any(sent_skb);
|
||||
return num_wrbs;
|
||||
}
|
||||
|
||||
|
||||
@@ -1527,12 +1527,12 @@ ixgb_xmit_frame(struct sk_buff *skb, struct net_device *netdev)
|
||||
int tso;
|
||||
|
||||
if (test_bit(__IXGB_DOWN, &adapter->flags)) {
|
||||
dev_kfree_skb(skb);
|
||||
dev_kfree_skb_any(skb);
|
||||
return NETDEV_TX_OK;
|
||||
}
|
||||
|
||||
if (skb->len <= 0) {
|
||||
dev_kfree_skb(skb);
|
||||
dev_kfree_skb_any(skb);
|
||||
return NETDEV_TX_OK;
|
||||
}
|
||||
|
||||
@@ -1549,7 +1549,7 @@ ixgb_xmit_frame(struct sk_buff *skb, struct net_device *netdev)
|
||||
|
||||
tso = ixgb_tso(adapter, skb);
|
||||
if (tso < 0) {
|
||||
dev_kfree_skb(skb);
|
||||
dev_kfree_skb_any(skb);
|
||||
return NETDEV_TX_OK;
|
||||
}
|
||||
|
||||
|
||||
@@ -899,7 +899,7 @@ out_unlock:
|
||||
|
||||
return NETDEV_TX_OK;
|
||||
out_dma_error:
|
||||
kfree_skb(skb);
|
||||
dev_kfree_skb_any(skb);
|
||||
cp->dev->stats.tx_dropped++;
|
||||
goto out_unlock;
|
||||
}
|
||||
|
||||
@@ -1715,9 +1715,9 @@ static netdev_tx_t rtl8139_start_xmit (struct sk_buff *skb,
|
||||
if (len < ETH_ZLEN)
|
||||
memset(tp->tx_buf[entry], 0, ETH_ZLEN);
|
||||
skb_copy_and_csum_dev(skb, tp->tx_buf[entry]);
|
||||
dev_kfree_skb(skb);
|
||||
dev_kfree_skb_any(skb);
|
||||
} else {
|
||||
dev_kfree_skb(skb);
|
||||
dev_kfree_skb_any(skb);
|
||||
dev->stats.tx_dropped++;
|
||||
return NETDEV_TX_OK;
|
||||
}
|
||||
|
||||
@@ -5768,7 +5768,7 @@ static void rtl8169_tx_clear_range(struct rtl8169_private *tp, u32 start,
|
||||
tp->TxDescArray + entry);
|
||||
if (skb) {
|
||||
tp->dev->stats.tx_dropped++;
|
||||
dev_kfree_skb(skb);
|
||||
dev_kfree_skb_any(skb);
|
||||
tx_skb->skb = NULL;
|
||||
}
|
||||
}
|
||||
@@ -5993,7 +5993,7 @@ static netdev_tx_t rtl8169_start_xmit(struct sk_buff *skb,
|
||||
err_dma_1:
|
||||
rtl8169_unmap_tx_skb(d, tp->tx_skb + entry, txd);
|
||||
err_dma_0:
|
||||
dev_kfree_skb(skb);
|
||||
dev_kfree_skb_any(skb);
|
||||
err_update_stats:
|
||||
dev->stats.tx_dropped++;
|
||||
return NETDEV_TX_OK;
|
||||
@@ -6076,7 +6076,7 @@ static void rtl_tx(struct net_device *dev, struct rtl8169_private *tp)
|
||||
tp->tx_stats.packets++;
|
||||
tp->tx_stats.bytes += tx_skb->skb->len;
|
||||
u64_stats_update_end(&tp->tx_stats.syncp);
|
||||
dev_kfree_skb(tx_skb->skb);
|
||||
dev_kfree_skb_any(tx_skb->skb);
|
||||
tx_skb->skb = NULL;
|
||||
}
|
||||
dirty_tx++;
|
||||
|
||||
@@ -98,7 +98,10 @@ static void dw8250_serial_out(struct uart_port *p, int offset, int value)
|
||||
dw8250_force_idle(p);
|
||||
writeb(value, p->membase + (UART_LCR << p->regshift));
|
||||
}
|
||||
dev_err(p->dev, "Couldn't set LCR to %d\n", value);
|
||||
/*
|
||||
* FIXME: this deadlocks if port->lock is already held
|
||||
* dev_err(p->dev, "Couldn't set LCR to %d\n", value);
|
||||
*/
|
||||
}
|
||||
}
|
||||
|
||||
@@ -116,8 +119,23 @@ static void dw8250_serial_out32(struct uart_port *p, int offset, int value)
|
||||
if (offset == UART_LCR)
|
||||
d->last_lcr = value;
|
||||
|
||||
offset <<= p->regshift;
|
||||
writel(value, p->membase + offset);
|
||||
writel(value, p->membase + (offset << p->regshift));
|
||||
|
||||
/* Make sure LCR write wasn't ignored */
|
||||
if (offset == UART_LCR) {
|
||||
int tries = 1000;
|
||||
while (tries--) {
|
||||
unsigned int lcr = p->serial_in(p, UART_LCR);
|
||||
if ((value & ~UART_LCR_SPAR) == (lcr & ~UART_LCR_SPAR))
|
||||
return;
|
||||
dw8250_force_idle(p);
|
||||
writel(value, p->membase + (UART_LCR << p->regshift));
|
||||
}
|
||||
/*
|
||||
* FIXME: this deadlocks if port->lock is already held
|
||||
* dev_err(p->dev, "Couldn't set LCR to %d\n", value);
|
||||
*/
|
||||
}
|
||||
}
|
||||
|
||||
static unsigned int dw8250_serial_in32(struct uart_port *p, int offset)
|
||||
|
||||
+1
-1
@@ -126,7 +126,7 @@ affs_fix_dcache(struct inode *inode, u32 entry_ino)
|
||||
{
|
||||
struct dentry *dentry;
|
||||
spin_lock(&inode->i_lock);
|
||||
hlist_for_each_entry(dentry, &inode->i_dentry, d_alias) {
|
||||
hlist_for_each_entry(dentry, &inode->i_dentry, d_u.d_alias) {
|
||||
if (entry_ino == (u32)(long)dentry->d_fsdata) {
|
||||
dentry->d_fsdata = (void *)inode->i_ino;
|
||||
break;
|
||||
|
||||
+6
-6
@@ -91,7 +91,7 @@ static struct dentry *get_next_positive_subdir(struct dentry *prev,
|
||||
spin_lock(&root->d_lock);
|
||||
|
||||
if (prev)
|
||||
next = prev->d_u.d_child.next;
|
||||
next = prev->d_child.next;
|
||||
else {
|
||||
prev = dget_dlock(root);
|
||||
next = prev->d_subdirs.next;
|
||||
@@ -105,13 +105,13 @@ cont:
|
||||
return NULL;
|
||||
}
|
||||
|
||||
q = list_entry(next, struct dentry, d_u.d_child);
|
||||
q = list_entry(next, struct dentry, d_child);
|
||||
|
||||
spin_lock_nested(&q->d_lock, DENTRY_D_LOCK_NESTED);
|
||||
/* Already gone or negative dentry (under construction) - try next */
|
||||
if (q->d_count == 0 || !simple_positive(q)) {
|
||||
spin_unlock(&q->d_lock);
|
||||
next = q->d_u.d_child.next;
|
||||
next = q->d_child.next;
|
||||
goto cont;
|
||||
}
|
||||
dget_dlock(q);
|
||||
@@ -161,13 +161,13 @@ again:
|
||||
goto relock;
|
||||
}
|
||||
spin_unlock(&p->d_lock);
|
||||
next = p->d_u.d_child.next;
|
||||
next = p->d_child.next;
|
||||
p = parent;
|
||||
if (next != &parent->d_subdirs)
|
||||
break;
|
||||
}
|
||||
}
|
||||
ret = list_entry(next, struct dentry, d_u.d_child);
|
||||
ret = list_entry(next, struct dentry, d_child);
|
||||
|
||||
spin_lock_nested(&ret->d_lock, DENTRY_D_LOCK_NESTED);
|
||||
/* Negative dentry - try next */
|
||||
@@ -447,7 +447,7 @@ found:
|
||||
spin_lock(&sbi->lookup_lock);
|
||||
spin_lock(&expired->d_parent->d_lock);
|
||||
spin_lock_nested(&expired->d_lock, DENTRY_D_LOCK_NESTED);
|
||||
list_move(&expired->d_parent->d_subdirs, &expired->d_u.d_child);
|
||||
list_move(&expired->d_parent->d_subdirs, &expired->d_child);
|
||||
spin_unlock(&expired->d_lock);
|
||||
spin_unlock(&expired->d_parent->d_lock);
|
||||
spin_unlock(&sbi->lookup_lock);
|
||||
|
||||
+1
-1
@@ -655,7 +655,7 @@ static void autofs_clear_leaf_automount_flags(struct dentry *dentry)
|
||||
/* only consider parents below dentrys in the root */
|
||||
if (IS_ROOT(parent->d_parent))
|
||||
return;
|
||||
d_child = &dentry->d_u.d_child;
|
||||
d_child = &dentry->d_child;
|
||||
/* Set parent managed if it's becoming empty */
|
||||
if (d_child->next == &parent->d_subdirs &&
|
||||
d_child->prev == &parent->d_subdirs)
|
||||
|
||||
+4
-4
@@ -103,7 +103,7 @@ static unsigned fpos_off(loff_t p)
|
||||
/*
|
||||
* When possible, we try to satisfy a readdir by peeking at the
|
||||
* dcache. We make this work by carefully ordering dentries on
|
||||
* d_u.d_child when we initially get results back from the MDS, and
|
||||
* d_child when we initially get results back from the MDS, and
|
||||
* falling back to a "normal" sync readdir if any dentries in the dir
|
||||
* are dropped.
|
||||
*
|
||||
@@ -139,11 +139,11 @@ static int __dcache_readdir(struct file *filp,
|
||||
p = parent->d_subdirs.prev;
|
||||
dout(" initial p %p/%p\n", p->prev, p->next);
|
||||
} else {
|
||||
p = last->d_u.d_child.prev;
|
||||
p = last->d_child.prev;
|
||||
}
|
||||
|
||||
more:
|
||||
dentry = list_entry(p, struct dentry, d_u.d_child);
|
||||
dentry = list_entry(p, struct dentry, d_child);
|
||||
di = ceph_dentry(dentry);
|
||||
while (1) {
|
||||
dout(" p %p/%p %s d_subdirs %p/%p\n", p->prev, p->next,
|
||||
@@ -165,7 +165,7 @@ more:
|
||||
!dentry->d_inode ? " null" : "");
|
||||
spin_unlock(&dentry->d_lock);
|
||||
p = p->prev;
|
||||
dentry = list_entry(p, struct dentry, d_u.d_child);
|
||||
dentry = list_entry(p, struct dentry, d_child);
|
||||
di = ceph_dentry(dentry);
|
||||
}
|
||||
|
||||
|
||||
+3
-3
@@ -867,9 +867,9 @@ static void ceph_set_dentry_offset(struct dentry *dn)
|
||||
|
||||
spin_lock(&dir->d_lock);
|
||||
spin_lock_nested(&dn->d_lock, DENTRY_D_LOCK_NESTED);
|
||||
list_move(&dn->d_u.d_child, &dir->d_subdirs);
|
||||
list_move(&dn->d_child, &dir->d_subdirs);
|
||||
dout("set_dentry_offset %p %lld (%p %p)\n", dn, di->offset,
|
||||
dn->d_u.d_child.prev, dn->d_u.d_child.next);
|
||||
dn->d_child.prev, dn->d_child.next);
|
||||
spin_unlock(&dn->d_lock);
|
||||
spin_unlock(&dir->d_lock);
|
||||
}
|
||||
@@ -1296,7 +1296,7 @@ retry_lookup:
|
||||
/* reorder parent's d_subdirs */
|
||||
spin_lock(&parent->d_lock);
|
||||
spin_lock_nested(&dn->d_lock, DENTRY_D_LOCK_NESTED);
|
||||
list_move(&dn->d_u.d_child, &parent->d_subdirs);
|
||||
list_move(&dn->d_child, &parent->d_subdirs);
|
||||
spin_unlock(&dn->d_lock);
|
||||
spin_unlock(&parent->d_lock);
|
||||
}
|
||||
|
||||
+1
-1
@@ -832,7 +832,7 @@ inode_has_hashed_dentries(struct inode *inode)
|
||||
struct dentry *dentry;
|
||||
|
||||
spin_lock(&inode->i_lock);
|
||||
hlist_for_each_entry(dentry, &inode->i_dentry, d_alias) {
|
||||
hlist_for_each_entry(dentry, &inode->i_dentry, d_u.d_alias) {
|
||||
if (!d_unhashed(dentry) || IS_ROOT(dentry)) {
|
||||
spin_unlock(&inode->i_lock);
|
||||
return true;
|
||||
|
||||
+1
-1
@@ -92,7 +92,7 @@ static void coda_flag_children(struct dentry *parent, int flag)
|
||||
struct dentry *de;
|
||||
|
||||
spin_lock(&parent->d_lock);
|
||||
list_for_each_entry(de, &parent->d_subdirs, d_u.d_child) {
|
||||
list_for_each_entry(de, &parent->d_subdirs, d_child) {
|
||||
/* don't know what to do with negative dentries */
|
||||
if (de->d_inode )
|
||||
coda_flag_inode(de->d_inode, flag);
|
||||
|
||||
+100
-76
@@ -43,7 +43,7 @@
|
||||
/*
|
||||
* Usage:
|
||||
* dcache->d_inode->i_lock protects:
|
||||
* - i_dentry, d_alias, d_inode of aliases
|
||||
* - i_dentry, d_u.d_alias, d_inode of aliases
|
||||
* dcache_hash_bucket lock protects:
|
||||
* - the dcache hash table
|
||||
* s_anon bl list spinlock protects:
|
||||
@@ -58,7 +58,7 @@
|
||||
* - d_unhashed()
|
||||
* - d_parent and d_subdirs
|
||||
* - childrens' d_child and d_parent
|
||||
* - d_alias, d_inode
|
||||
* - d_u.d_alias, d_inode
|
||||
*
|
||||
* Ordering:
|
||||
* dentry->d_inode->i_lock
|
||||
@@ -215,7 +215,6 @@ static void __d_free(struct rcu_head *head)
|
||||
{
|
||||
struct dentry *dentry = container_of(head, struct dentry, d_u.d_rcu);
|
||||
|
||||
WARN_ON(!hlist_unhashed(&dentry->d_alias));
|
||||
if (dname_external(dentry))
|
||||
kfree(dentry->d_name.name);
|
||||
kmem_cache_free(dentry_cache, dentry);
|
||||
@@ -226,6 +225,7 @@ static void __d_free(struct rcu_head *head)
|
||||
*/
|
||||
static void d_free(struct dentry *dentry)
|
||||
{
|
||||
WARN_ON(!hlist_unhashed(&dentry->d_u.d_alias));
|
||||
BUG_ON(dentry->d_count);
|
||||
this_cpu_dec(nr_dentry);
|
||||
if (dentry->d_op && dentry->d_op->d_release)
|
||||
@@ -264,7 +264,7 @@ static void dentry_iput(struct dentry * dentry)
|
||||
struct inode *inode = dentry->d_inode;
|
||||
if (inode) {
|
||||
dentry->d_inode = NULL;
|
||||
hlist_del_init(&dentry->d_alias);
|
||||
hlist_del_init(&dentry->d_u.d_alias);
|
||||
spin_unlock(&dentry->d_lock);
|
||||
spin_unlock(&inode->i_lock);
|
||||
if (!inode->i_nlink)
|
||||
@@ -288,7 +288,7 @@ static void dentry_unlink_inode(struct dentry * dentry)
|
||||
{
|
||||
struct inode *inode = dentry->d_inode;
|
||||
dentry->d_inode = NULL;
|
||||
hlist_del_init(&dentry->d_alias);
|
||||
hlist_del_init(&dentry->d_u.d_alias);
|
||||
dentry_rcuwalk_barrier(dentry);
|
||||
spin_unlock(&dentry->d_lock);
|
||||
spin_unlock(&inode->i_lock);
|
||||
@@ -364,9 +364,9 @@ static struct dentry *d_kill(struct dentry *dentry, struct dentry *parent)
|
||||
__releases(parent->d_lock)
|
||||
__releases(dentry->d_inode->i_lock)
|
||||
{
|
||||
list_del(&dentry->d_u.d_child);
|
||||
__list_del_entry(&dentry->d_child);
|
||||
/*
|
||||
* Inform try_to_ascend() that we are no longer attached to the
|
||||
* Inform ascending readers that we are no longer attached to the
|
||||
* dentry tree
|
||||
*/
|
||||
dentry->d_flags |= DCACHE_DENTRY_KILLED;
|
||||
@@ -660,7 +660,7 @@ static struct dentry *__d_find_alias(struct inode *inode, int want_discon)
|
||||
|
||||
again:
|
||||
discon_alias = NULL;
|
||||
hlist_for_each_entry(alias, &inode->i_dentry, d_alias) {
|
||||
hlist_for_each_entry(alias, &inode->i_dentry, d_u.d_alias) {
|
||||
spin_lock(&alias->d_lock);
|
||||
if (S_ISDIR(inode->i_mode) || !d_unhashed(alias)) {
|
||||
if (IS_ROOT(alias) &&
|
||||
@@ -713,7 +713,7 @@ void d_prune_aliases(struct inode *inode)
|
||||
struct dentry *dentry;
|
||||
restart:
|
||||
spin_lock(&inode->i_lock);
|
||||
hlist_for_each_entry(dentry, &inode->i_dentry, d_alias) {
|
||||
hlist_for_each_entry(dentry, &inode->i_dentry, d_u.d_alias) {
|
||||
spin_lock(&dentry->d_lock);
|
||||
if (!dentry->d_count) {
|
||||
__dget_dlock(dentry);
|
||||
@@ -893,7 +893,7 @@ static void shrink_dcache_for_umount_subtree(struct dentry *dentry)
|
||||
/* descend to the first leaf in the current subtree */
|
||||
while (!list_empty(&dentry->d_subdirs))
|
||||
dentry = list_entry(dentry->d_subdirs.next,
|
||||
struct dentry, d_u.d_child);
|
||||
struct dentry, d_child);
|
||||
|
||||
/* consume the dentries from this leaf up through its parents
|
||||
* until we find one with children or run out altogether */
|
||||
@@ -927,17 +927,17 @@ static void shrink_dcache_for_umount_subtree(struct dentry *dentry)
|
||||
|
||||
if (IS_ROOT(dentry)) {
|
||||
parent = NULL;
|
||||
list_del(&dentry->d_u.d_child);
|
||||
list_del(&dentry->d_child);
|
||||
} else {
|
||||
parent = dentry->d_parent;
|
||||
parent->d_count--;
|
||||
list_del(&dentry->d_u.d_child);
|
||||
list_del(&dentry->d_child);
|
||||
}
|
||||
|
||||
inode = dentry->d_inode;
|
||||
if (inode) {
|
||||
dentry->d_inode = NULL;
|
||||
hlist_del_init(&dentry->d_alias);
|
||||
hlist_del_init(&dentry->d_u.d_alias);
|
||||
if (dentry->d_op && dentry->d_op->d_iput)
|
||||
dentry->d_op->d_iput(dentry, inode);
|
||||
else
|
||||
@@ -955,7 +955,7 @@ static void shrink_dcache_for_umount_subtree(struct dentry *dentry)
|
||||
} while (list_empty(&dentry->d_subdirs));
|
||||
|
||||
dentry = list_entry(dentry->d_subdirs.next,
|
||||
struct dentry, d_u.d_child);
|
||||
struct dentry, d_child);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -987,35 +987,6 @@ void shrink_dcache_for_umount(struct super_block *sb)
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* This tries to ascend one level of parenthood, but
|
||||
* we can race with renaming, so we need to re-check
|
||||
* the parenthood after dropping the lock and check
|
||||
* that the sequence number still matches.
|
||||
*/
|
||||
static struct dentry *try_to_ascend(struct dentry *old, int locked, unsigned seq)
|
||||
{
|
||||
struct dentry *new = old->d_parent;
|
||||
|
||||
rcu_read_lock();
|
||||
spin_unlock(&old->d_lock);
|
||||
spin_lock(&new->d_lock);
|
||||
|
||||
/*
|
||||
* might go back up the wrong parent if we have had a rename
|
||||
* or deletion
|
||||
*/
|
||||
if (new != old->d_parent ||
|
||||
(old->d_flags & DCACHE_DENTRY_KILLED) ||
|
||||
(!locked && read_seqretry(&rename_lock, seq))) {
|
||||
spin_unlock(&new->d_lock);
|
||||
new = NULL;
|
||||
}
|
||||
rcu_read_unlock();
|
||||
return new;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Search for at least 1 mount point in the dentry's subdirs.
|
||||
* We descend to the next level whenever the d_subdirs
|
||||
@@ -1048,7 +1019,7 @@ repeat:
|
||||
resume:
|
||||
while (next != &this_parent->d_subdirs) {
|
||||
struct list_head *tmp = next;
|
||||
struct dentry *dentry = list_entry(tmp, struct dentry, d_u.d_child);
|
||||
struct dentry *dentry = list_entry(tmp, struct dentry, d_child);
|
||||
next = tmp->next;
|
||||
|
||||
spin_lock_nested(&dentry->d_lock, DENTRY_D_LOCK_NESTED);
|
||||
@@ -1070,30 +1041,48 @@ resume:
|
||||
/*
|
||||
* All done at this level ... ascend and resume the search.
|
||||
*/
|
||||
rcu_read_lock();
|
||||
ascend:
|
||||
if (this_parent != parent) {
|
||||
struct dentry *child = this_parent;
|
||||
this_parent = try_to_ascend(this_parent, locked, seq);
|
||||
if (!this_parent)
|
||||
this_parent = child->d_parent;
|
||||
|
||||
spin_unlock(&child->d_lock);
|
||||
spin_lock(&this_parent->d_lock);
|
||||
|
||||
/* might go back up the wrong parent if we have had a rename. */
|
||||
if (!locked && read_seqretry(&rename_lock, seq))
|
||||
goto rename_retry;
|
||||
next = child->d_u.d_child.next;
|
||||
next = child->d_child.next;
|
||||
while (unlikely(child->d_flags & DCACHE_DENTRY_KILLED)) {
|
||||
if (next == &this_parent->d_subdirs)
|
||||
goto ascend;
|
||||
child = list_entry(next, struct dentry, d_child);
|
||||
next = next->next;
|
||||
}
|
||||
rcu_read_unlock();
|
||||
goto resume;
|
||||
}
|
||||
spin_unlock(&this_parent->d_lock);
|
||||
if (!locked && read_seqretry(&rename_lock, seq))
|
||||
goto rename_retry;
|
||||
spin_unlock(&this_parent->d_lock);
|
||||
rcu_read_unlock();
|
||||
if (locked)
|
||||
write_sequnlock(&rename_lock);
|
||||
return 0; /* No mount points found in tree */
|
||||
positive:
|
||||
if (!locked && read_seqretry(&rename_lock, seq))
|
||||
goto rename_retry;
|
||||
goto rename_retry_unlocked;
|
||||
if (locked)
|
||||
write_sequnlock(&rename_lock);
|
||||
return 1;
|
||||
|
||||
rename_retry:
|
||||
spin_unlock(&this_parent->d_lock);
|
||||
rcu_read_unlock();
|
||||
if (locked)
|
||||
goto again;
|
||||
rename_retry_unlocked:
|
||||
locked = 1;
|
||||
write_seqlock(&rename_lock);
|
||||
goto again;
|
||||
@@ -1131,7 +1120,7 @@ repeat:
|
||||
resume:
|
||||
while (next != &this_parent->d_subdirs) {
|
||||
struct list_head *tmp = next;
|
||||
struct dentry *dentry = list_entry(tmp, struct dentry, d_u.d_child);
|
||||
struct dentry *dentry = list_entry(tmp, struct dentry, d_child);
|
||||
next = tmp->next;
|
||||
|
||||
spin_lock_nested(&dentry->d_lock, DENTRY_D_LOCK_NESTED);
|
||||
@@ -1158,6 +1147,7 @@ resume:
|
||||
*/
|
||||
if (found && need_resched()) {
|
||||
spin_unlock(&dentry->d_lock);
|
||||
rcu_read_lock();
|
||||
goto out;
|
||||
}
|
||||
|
||||
@@ -1177,23 +1167,40 @@ resume:
|
||||
/*
|
||||
* All done at this level ... ascend and resume the search.
|
||||
*/
|
||||
rcu_read_lock();
|
||||
ascend:
|
||||
if (this_parent != parent) {
|
||||
struct dentry *child = this_parent;
|
||||
this_parent = try_to_ascend(this_parent, locked, seq);
|
||||
if (!this_parent)
|
||||
this_parent = child->d_parent;
|
||||
|
||||
spin_unlock(&child->d_lock);
|
||||
spin_lock(&this_parent->d_lock);
|
||||
|
||||
/* might go back up the wrong parent if we have had a rename. */
|
||||
if (!locked && read_seqretry(&rename_lock, seq))
|
||||
goto rename_retry;
|
||||
next = child->d_u.d_child.next;
|
||||
next = child->d_child.next;
|
||||
while (unlikely(child->d_flags & DCACHE_DENTRY_KILLED)) {
|
||||
if (next == &this_parent->d_subdirs)
|
||||
goto ascend;
|
||||
child = list_entry(next, struct dentry, d_child);
|
||||
next = next->next;
|
||||
}
|
||||
rcu_read_unlock();
|
||||
goto resume;
|
||||
}
|
||||
out:
|
||||
spin_unlock(&this_parent->d_lock);
|
||||
if (!locked && read_seqretry(&rename_lock, seq))
|
||||
goto rename_retry;
|
||||
spin_unlock(&this_parent->d_lock);
|
||||
rcu_read_unlock();
|
||||
if (locked)
|
||||
write_sequnlock(&rename_lock);
|
||||
return found;
|
||||
|
||||
rename_retry:
|
||||
spin_unlock(&this_parent->d_lock);
|
||||
rcu_read_unlock();
|
||||
if (found)
|
||||
return found;
|
||||
if (locked)
|
||||
@@ -1278,8 +1285,8 @@ struct dentry *__d_alloc(struct super_block *sb, const struct qstr *name)
|
||||
INIT_HLIST_BL_NODE(&dentry->d_hash);
|
||||
INIT_LIST_HEAD(&dentry->d_lru);
|
||||
INIT_LIST_HEAD(&dentry->d_subdirs);
|
||||
INIT_HLIST_NODE(&dentry->d_alias);
|
||||
INIT_LIST_HEAD(&dentry->d_u.d_child);
|
||||
INIT_HLIST_NODE(&dentry->d_u.d_alias);
|
||||
INIT_LIST_HEAD(&dentry->d_child);
|
||||
d_set_d_op(dentry, dentry->d_sb->s_d_op);
|
||||
|
||||
this_cpu_inc(nr_dentry);
|
||||
@@ -1309,7 +1316,7 @@ struct dentry *d_alloc(struct dentry * parent, const struct qstr *name)
|
||||
*/
|
||||
__dget_dlock(parent);
|
||||
dentry->d_parent = parent;
|
||||
list_add(&dentry->d_u.d_child, &parent->d_subdirs);
|
||||
list_add(&dentry->d_child, &parent->d_subdirs);
|
||||
spin_unlock(&parent->d_lock);
|
||||
|
||||
return dentry;
|
||||
@@ -1369,7 +1376,7 @@ static void __d_instantiate(struct dentry *dentry, struct inode *inode)
|
||||
if (inode) {
|
||||
if (unlikely(IS_AUTOMOUNT(inode)))
|
||||
dentry->d_flags |= DCACHE_NEED_AUTOMOUNT;
|
||||
hlist_add_head(&dentry->d_alias, &inode->i_dentry);
|
||||
hlist_add_head(&dentry->d_u.d_alias, &inode->i_dentry);
|
||||
}
|
||||
dentry->d_inode = inode;
|
||||
dentry_rcuwalk_barrier(dentry);
|
||||
@@ -1394,7 +1401,7 @@ static void __d_instantiate(struct dentry *dentry, struct inode *inode)
|
||||
|
||||
void d_instantiate(struct dentry *entry, struct inode * inode)
|
||||
{
|
||||
BUG_ON(!hlist_unhashed(&entry->d_alias));
|
||||
BUG_ON(!hlist_unhashed(&entry->d_u.d_alias));
|
||||
if (inode)
|
||||
spin_lock(&inode->i_lock);
|
||||
__d_instantiate(entry, inode);
|
||||
@@ -1433,7 +1440,7 @@ static struct dentry *__d_instantiate_unique(struct dentry *entry,
|
||||
return NULL;
|
||||
}
|
||||
|
||||
hlist_for_each_entry(alias, &inode->i_dentry, d_alias) {
|
||||
hlist_for_each_entry(alias, &inode->i_dentry, d_u.d_alias) {
|
||||
/*
|
||||
* Don't need alias->d_lock here, because aliases with
|
||||
* d_parent == entry->d_parent are not subject to name or
|
||||
@@ -1459,7 +1466,7 @@ struct dentry *d_instantiate_unique(struct dentry *entry, struct inode *inode)
|
||||
{
|
||||
struct dentry *result;
|
||||
|
||||
BUG_ON(!hlist_unhashed(&entry->d_alias));
|
||||
BUG_ON(!hlist_unhashed(&entry->d_u.d_alias));
|
||||
|
||||
if (inode)
|
||||
spin_lock(&inode->i_lock);
|
||||
@@ -1502,7 +1509,7 @@ static struct dentry * __d_find_any_alias(struct inode *inode)
|
||||
|
||||
if (hlist_empty(&inode->i_dentry))
|
||||
return NULL;
|
||||
alias = hlist_entry(inode->i_dentry.first, struct dentry, d_alias);
|
||||
alias = hlist_entry(inode->i_dentry.first, struct dentry, d_u.d_alias);
|
||||
__dget(alias);
|
||||
return alias;
|
||||
}
|
||||
@@ -1576,7 +1583,7 @@ struct dentry *d_obtain_alias(struct inode *inode)
|
||||
spin_lock(&tmp->d_lock);
|
||||
tmp->d_inode = inode;
|
||||
tmp->d_flags |= DCACHE_DISCONNECTED;
|
||||
hlist_add_head(&tmp->d_alias, &inode->i_dentry);
|
||||
hlist_add_head(&tmp->d_u.d_alias, &inode->i_dentry);
|
||||
hlist_bl_lock(&tmp->d_sb->s_anon);
|
||||
hlist_bl_add_head(&tmp->d_hash, &tmp->d_sb->s_anon);
|
||||
hlist_bl_unlock(&tmp->d_sb->s_anon);
|
||||
@@ -2019,7 +2026,7 @@ int d_validate(struct dentry *dentry, struct dentry *dparent)
|
||||
struct dentry *child;
|
||||
|
||||
spin_lock(&dparent->d_lock);
|
||||
list_for_each_entry(child, &dparent->d_subdirs, d_u.d_child) {
|
||||
list_for_each_entry(child, &dparent->d_subdirs, d_child) {
|
||||
if (dentry == child) {
|
||||
spin_lock_nested(&dentry->d_lock, DENTRY_D_LOCK_NESTED);
|
||||
__dget_dlock(dentry);
|
||||
@@ -2266,8 +2273,8 @@ static void __d_move(struct dentry * dentry, struct dentry * target)
|
||||
/* Unhash the target: dput() will then get rid of it */
|
||||
__d_drop(target);
|
||||
|
||||
list_del(&dentry->d_u.d_child);
|
||||
list_del(&target->d_u.d_child);
|
||||
list_del(&dentry->d_child);
|
||||
list_del(&target->d_child);
|
||||
|
||||
/* Switch the names.. */
|
||||
switch_names(dentry, target);
|
||||
@@ -2277,15 +2284,15 @@ static void __d_move(struct dentry * dentry, struct dentry * target)
|
||||
if (IS_ROOT(dentry)) {
|
||||
dentry->d_parent = target->d_parent;
|
||||
target->d_parent = target;
|
||||
INIT_LIST_HEAD(&target->d_u.d_child);
|
||||
INIT_LIST_HEAD(&target->d_child);
|
||||
} else {
|
||||
swap(dentry->d_parent, target->d_parent);
|
||||
|
||||
/* And add them back to the (new) parent lists */
|
||||
list_add(&target->d_u.d_child, &target->d_parent->d_subdirs);
|
||||
list_add(&target->d_child, &target->d_parent->d_subdirs);
|
||||
}
|
||||
|
||||
list_add(&dentry->d_u.d_child, &dentry->d_parent->d_subdirs);
|
||||
list_add(&dentry->d_child, &dentry->d_parent->d_subdirs);
|
||||
|
||||
write_seqcount_end(&target->d_seq);
|
||||
write_seqcount_end(&dentry->d_seq);
|
||||
@@ -2392,9 +2399,9 @@ static void __d_materialise_dentry(struct dentry *dentry, struct dentry *anon)
|
||||
swap(dentry->d_name.hash, anon->d_name.hash);
|
||||
|
||||
dentry->d_parent = dentry;
|
||||
list_del_init(&dentry->d_u.d_child);
|
||||
list_del_init(&dentry->d_child);
|
||||
anon->d_parent = dparent;
|
||||
list_move(&anon->d_u.d_child, &dparent->d_subdirs);
|
||||
list_move(&anon->d_child, &dparent->d_subdirs);
|
||||
|
||||
write_seqcount_end(&dentry->d_seq);
|
||||
write_seqcount_end(&anon->d_seq);
|
||||
@@ -2933,7 +2940,7 @@ repeat:
|
||||
resume:
|
||||
while (next != &this_parent->d_subdirs) {
|
||||
struct list_head *tmp = next;
|
||||
struct dentry *dentry = list_entry(tmp, struct dentry, d_u.d_child);
|
||||
struct dentry *dentry = list_entry(tmp, struct dentry, d_child);
|
||||
next = tmp->next;
|
||||
|
||||
spin_lock_nested(&dentry->d_lock, DENTRY_D_LOCK_NESTED);
|
||||
@@ -2954,26 +2961,43 @@ resume:
|
||||
}
|
||||
spin_unlock(&dentry->d_lock);
|
||||
}
|
||||
rcu_read_lock();
|
||||
ascend:
|
||||
if (this_parent != root) {
|
||||
struct dentry *child = this_parent;
|
||||
if (!(this_parent->d_flags & DCACHE_GENOCIDE)) {
|
||||
this_parent->d_flags |= DCACHE_GENOCIDE;
|
||||
this_parent->d_count--;
|
||||
}
|
||||
this_parent = try_to_ascend(this_parent, locked, seq);
|
||||
if (!this_parent)
|
||||
this_parent = child->d_parent;
|
||||
|
||||
spin_unlock(&child->d_lock);
|
||||
spin_lock(&this_parent->d_lock);
|
||||
|
||||
/* might go back up the wrong parent if we have had a rename. */
|
||||
if (!locked && read_seqretry(&rename_lock, seq))
|
||||
goto rename_retry;
|
||||
next = child->d_u.d_child.next;
|
||||
next = child->d_child.next;
|
||||
while (unlikely(child->d_flags & DCACHE_DENTRY_KILLED)) {
|
||||
if (next == &this_parent->d_subdirs)
|
||||
goto ascend;
|
||||
child = list_entry(next, struct dentry, d_child);
|
||||
next = next->next;
|
||||
}
|
||||
rcu_read_unlock();
|
||||
goto resume;
|
||||
}
|
||||
spin_unlock(&this_parent->d_lock);
|
||||
if (!locked && read_seqretry(&rename_lock, seq))
|
||||
goto rename_retry;
|
||||
spin_unlock(&this_parent->d_lock);
|
||||
rcu_read_unlock();
|
||||
if (locked)
|
||||
write_sequnlock(&rename_lock);
|
||||
return;
|
||||
|
||||
rename_retry:
|
||||
spin_unlock(&this_parent->d_lock);
|
||||
rcu_read_unlock();
|
||||
if (locked)
|
||||
goto again;
|
||||
locked = 1;
|
||||
|
||||
+3
-3
@@ -545,7 +545,7 @@ void debugfs_remove_recursive(struct dentry *dentry)
|
||||
parent = dentry;
|
||||
down:
|
||||
mutex_lock(&parent->d_inode->i_mutex);
|
||||
list_for_each_entry_safe(child, next, &parent->d_subdirs, d_u.d_child) {
|
||||
list_for_each_entry_safe(child, next, &parent->d_subdirs, d_child) {
|
||||
if (!debugfs_positive(child))
|
||||
continue;
|
||||
|
||||
@@ -566,8 +566,8 @@ void debugfs_remove_recursive(struct dentry *dentry)
|
||||
mutex_lock(&parent->d_inode->i_mutex);
|
||||
|
||||
if (child != dentry) {
|
||||
next = list_entry(child->d_u.d_child.next, struct dentry,
|
||||
d_u.d_child);
|
||||
next = list_entry(child->d_child.next, struct dentry,
|
||||
d_child);
|
||||
goto up;
|
||||
}
|
||||
|
||||
|
||||
+1
-1
@@ -50,7 +50,7 @@ find_acceptable_alias(struct dentry *result,
|
||||
|
||||
inode = result->d_inode;
|
||||
spin_lock(&inode->i_lock);
|
||||
hlist_for_each_entry(dentry, &inode->i_dentry, d_alias) {
|
||||
hlist_for_each_entry(dentry, &inode->i_dentry, d_u.d_alias) {
|
||||
dget(dentry);
|
||||
spin_unlock(&inode->i_lock);
|
||||
if (toput)
|
||||
|
||||
+2
-2
@@ -3103,7 +3103,7 @@ int jfs_readdir(struct file *filp, void *dirent, filldir_t filldir)
|
||||
* self "."
|
||||
*/
|
||||
filp->f_pos = 1;
|
||||
if (filldir(dirent, ".", 1, 0, ip->i_ino,
|
||||
if (filldir(dirent, ".", 1, 1, ip->i_ino,
|
||||
DT_DIR))
|
||||
return 0;
|
||||
}
|
||||
@@ -3111,7 +3111,7 @@ int jfs_readdir(struct file *filp, void *dirent, filldir_t filldir)
|
||||
* parent ".."
|
||||
*/
|
||||
filp->f_pos = 2;
|
||||
if (filldir(dirent, "..", 2, 1, PARENT(ip), DT_DIR))
|
||||
if (filldir(dirent, "..", 2, 2, PARENT(ip), DT_DIR))
|
||||
return 0;
|
||||
|
||||
/*
|
||||
|
||||
+6
-6
@@ -104,18 +104,18 @@ loff_t dcache_dir_lseek(struct file *file, loff_t offset, int whence)
|
||||
|
||||
spin_lock(&dentry->d_lock);
|
||||
/* d_lock not required for cursor */
|
||||
list_del(&cursor->d_u.d_child);
|
||||
list_del(&cursor->d_child);
|
||||
p = dentry->d_subdirs.next;
|
||||
while (n && p != &dentry->d_subdirs) {
|
||||
struct dentry *next;
|
||||
next = list_entry(p, struct dentry, d_u.d_child);
|
||||
next = list_entry(p, struct dentry, d_child);
|
||||
spin_lock_nested(&next->d_lock, DENTRY_D_LOCK_NESTED);
|
||||
if (simple_positive(next))
|
||||
n--;
|
||||
spin_unlock(&next->d_lock);
|
||||
p = p->next;
|
||||
}
|
||||
list_add_tail(&cursor->d_u.d_child, p);
|
||||
list_add_tail(&cursor->d_child, p);
|
||||
spin_unlock(&dentry->d_lock);
|
||||
}
|
||||
}
|
||||
@@ -139,7 +139,7 @@ int dcache_readdir(struct file * filp, void * dirent, filldir_t filldir)
|
||||
{
|
||||
struct dentry *dentry = filp->f_path.dentry;
|
||||
struct dentry *cursor = filp->private_data;
|
||||
struct list_head *p, *q = &cursor->d_u.d_child;
|
||||
struct list_head *p, *q = &cursor->d_child;
|
||||
ino_t ino;
|
||||
int i = filp->f_pos;
|
||||
|
||||
@@ -165,7 +165,7 @@ int dcache_readdir(struct file * filp, void * dirent, filldir_t filldir)
|
||||
|
||||
for (p=q->next; p != &dentry->d_subdirs; p=p->next) {
|
||||
struct dentry *next;
|
||||
next = list_entry(p, struct dentry, d_u.d_child);
|
||||
next = list_entry(p, struct dentry, d_child);
|
||||
spin_lock_nested(&next->d_lock, DENTRY_D_LOCK_NESTED);
|
||||
if (!simple_positive(next)) {
|
||||
spin_unlock(&next->d_lock);
|
||||
@@ -289,7 +289,7 @@ int simple_empty(struct dentry *dentry)
|
||||
int ret = 0;
|
||||
|
||||
spin_lock(&dentry->d_lock);
|
||||
list_for_each_entry(child, &dentry->d_subdirs, d_u.d_child) {
|
||||
list_for_each_entry(child, &dentry->d_subdirs, d_child) {
|
||||
spin_lock_nested(&child->d_lock, DENTRY_D_LOCK_NESTED);
|
||||
if (simple_positive(child)) {
|
||||
spin_unlock(&child->d_lock);
|
||||
|
||||
+1
-1
@@ -391,7 +391,7 @@ ncp_dget_fpos(struct dentry *dentry, struct dentry *parent, unsigned long fpos)
|
||||
spin_lock(&parent->d_lock);
|
||||
next = parent->d_subdirs.next;
|
||||
while (next != &parent->d_subdirs) {
|
||||
dent = list_entry(next, struct dentry, d_u.d_child);
|
||||
dent = list_entry(next, struct dentry, d_child);
|
||||
if ((unsigned long)dent->d_fsdata == fpos) {
|
||||
if (dent->d_inode)
|
||||
dget(dent);
|
||||
|
||||
@@ -194,7 +194,7 @@ ncp_renew_dentries(struct dentry *parent)
|
||||
spin_lock(&parent->d_lock);
|
||||
next = parent->d_subdirs.next;
|
||||
while (next != &parent->d_subdirs) {
|
||||
dentry = list_entry(next, struct dentry, d_u.d_child);
|
||||
dentry = list_entry(next, struct dentry, d_child);
|
||||
|
||||
if (dentry->d_fsdata == NULL)
|
||||
ncp_age_dentry(server, dentry);
|
||||
@@ -216,7 +216,7 @@ ncp_invalidate_dircache_entries(struct dentry *parent)
|
||||
spin_lock(&parent->d_lock);
|
||||
next = parent->d_subdirs.next;
|
||||
while (next != &parent->d_subdirs) {
|
||||
dentry = list_entry(next, struct dentry, d_u.d_child);
|
||||
dentry = list_entry(next, struct dentry, d_child);
|
||||
dentry->d_fsdata = NULL;
|
||||
ncp_age_dentry(server, dentry);
|
||||
next = next->next;
|
||||
|
||||
+1
-1
@@ -58,7 +58,7 @@ static int nfs_superblock_set_dummy_root(struct super_block *sb, struct inode *i
|
||||
*/
|
||||
spin_lock(&sb->s_root->d_inode->i_lock);
|
||||
spin_lock(&sb->s_root->d_lock);
|
||||
hlist_del_init(&sb->s_root->d_alias);
|
||||
hlist_del_init(&sb->s_root->d_u.d_alias);
|
||||
spin_unlock(&sb->s_root->d_lock);
|
||||
spin_unlock(&sb->s_root->d_inode->i_lock);
|
||||
}
|
||||
|
||||
@@ -63,14 +63,14 @@ void __fsnotify_update_child_dentry_flags(struct inode *inode)
|
||||
spin_lock(&inode->i_lock);
|
||||
/* run all of the dentries associated with this inode. Since this is a
|
||||
* directory, there damn well better only be one item on this list */
|
||||
hlist_for_each_entry(alias, &inode->i_dentry, d_alias) {
|
||||
hlist_for_each_entry(alias, &inode->i_dentry, d_u.d_alias) {
|
||||
struct dentry *child;
|
||||
|
||||
/* run all of the children of the original inode and fix their
|
||||
* d_flags to indicate parental interest (their parent is the
|
||||
* original inode) */
|
||||
spin_lock(&alias->d_lock);
|
||||
list_for_each_entry(child, &alias->d_subdirs, d_u.d_child) {
|
||||
list_for_each_entry(child, &alias->d_subdirs, d_child) {
|
||||
if (!child->d_inode)
|
||||
continue;
|
||||
|
||||
|
||||
+1
-1
@@ -172,7 +172,7 @@ struct dentry *ocfs2_find_local_alias(struct inode *inode,
|
||||
struct dentry *dentry;
|
||||
|
||||
spin_lock(&inode->i_lock);
|
||||
hlist_for_each_entry(dentry, &inode->i_dentry, d_alias) {
|
||||
hlist_for_each_entry(dentry, &inode->i_dentry, d_u.d_alias) {
|
||||
spin_lock(&dentry->d_lock);
|
||||
if (ocfs2_match_dentry(dentry, parent_blkno, skip_unhashed)) {
|
||||
trace_ocfs2_find_local_alias(dentry->d_name.len,
|
||||
|
||||
+5
-3
@@ -2459,12 +2459,14 @@ static ssize_t ocfs2_file_splice_write(struct pipe_inode_info *pipe,
|
||||
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,
|
||||
};
|
||||
|
||||
ret = generic_write_checks(out, ppos, &len, 0);
|
||||
if(ret)
|
||||
return ret;
|
||||
sd.total_len = len;
|
||||
sd.pos = *ppos;
|
||||
|
||||
trace_ocfs2_file_splice_write(inode, out, out->f_path.dentry,
|
||||
(unsigned long long)OCFS2_I(inode)->ip_blkno,
|
||||
|
||||
@@ -1954,8 +1954,6 @@ struct treepath var = {.path_length = ILLEGAL_PATH_ELEMENT_OFFSET, .reada = 0,}
|
||||
#define MAX_US_INT 0xffff
|
||||
|
||||
// reiserfs version 2 has max offset 60 bits. Version 1 - 32 bit offset
|
||||
#define U32_MAX (~(__u32)0)
|
||||
|
||||
static inline loff_t max_reiserfs_offset(struct inode *inode)
|
||||
{
|
||||
if (get_inode_item_key_version(inode) == KEY_FORMAT_3_5)
|
||||
|
||||
+6
-2
@@ -1012,13 +1012,17 @@ generic_file_splice_write(struct pipe_inode_info *pipe, struct file *out,
|
||||
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,
|
||||
};
|
||||
ssize_t ret;
|
||||
|
||||
ret = generic_write_checks(out, ppos, &len, S_ISBLK(inode->i_mode));
|
||||
if (ret)
|
||||
return ret;
|
||||
sd.total_len = len;
|
||||
sd.pos = *ppos;
|
||||
|
||||
pipe_lock(pipe);
|
||||
|
||||
splice_from_pipe_begin(&sd);
|
||||
|
||||
@@ -550,11 +550,10 @@ static inline int pmd_none_or_trans_huge_or_clear_bad(pmd_t *pmd)
|
||||
#ifdef CONFIG_TRANSPARENT_HUGEPAGE
|
||||
barrier();
|
||||
#endif
|
||||
if (pmd_none(pmdval))
|
||||
if (pmd_none(pmdval) || pmd_trans_huge(pmdval))
|
||||
return 1;
|
||||
if (unlikely(pmd_bad(pmdval))) {
|
||||
if (!pmd_trans_huge(pmdval))
|
||||
pmd_clear_bad(pmd);
|
||||
pmd_clear_bad(pmd);
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
|
||||
@@ -8,23 +8,6 @@
|
||||
|
||||
#include <linux/ceph/types.h>
|
||||
|
||||
/* This seemed to be the easiest place to define these */
|
||||
|
||||
#define U8_MAX ((u8)(~0U))
|
||||
#define U16_MAX ((u16)(~0U))
|
||||
#define U32_MAX ((u32)(~0U))
|
||||
#define U64_MAX ((u64)(~0ULL))
|
||||
|
||||
#define S8_MAX ((s8)(U8_MAX >> 1))
|
||||
#define S16_MAX ((s16)(U16_MAX >> 1))
|
||||
#define S32_MAX ((s32)(U32_MAX >> 1))
|
||||
#define S64_MAX ((s64)(U64_MAX >> 1LL))
|
||||
|
||||
#define S8_MIN ((s8)(-S8_MAX - 1))
|
||||
#define S16_MIN ((s16)(-S16_MAX - 1))
|
||||
#define S32_MIN ((s32)(-S32_MAX - 1))
|
||||
#define S64_MIN ((s64)(-S64_MAX - 1LL))
|
||||
|
||||
/*
|
||||
* in all cases,
|
||||
* void **p pointer to position pointer
|
||||
|
||||
@@ -120,15 +120,15 @@ struct dentry {
|
||||
void *d_fsdata; /* fs-specific data */
|
||||
|
||||
struct list_head d_lru; /* LRU list */
|
||||
struct list_head d_child; /* child of parent list */
|
||||
struct list_head d_subdirs; /* our children */
|
||||
/*
|
||||
* d_child and d_rcu can share memory
|
||||
* d_alias and d_rcu can share memory
|
||||
*/
|
||||
union {
|
||||
struct list_head d_child; /* child of parent list */
|
||||
struct hlist_node d_alias; /* inode alias list */
|
||||
struct rcu_head d_rcu;
|
||||
} d_u;
|
||||
struct list_head d_subdirs; /* our children */
|
||||
struct hlist_node d_alias; /* inode alias list */
|
||||
};
|
||||
|
||||
/*
|
||||
|
||||
+3
-2
@@ -894,6 +894,7 @@ static inline int page_mapped(struct page *page)
|
||||
#define VM_FAULT_WRITE 0x0008 /* Special case for get_user_pages */
|
||||
#define VM_FAULT_HWPOISON 0x0010 /* Hit poisoned small page */
|
||||
#define VM_FAULT_HWPOISON_LARGE 0x0020 /* Hit poisoned large page. Index encoded in upper bits */
|
||||
#define VM_FAULT_SIGSEGV 0x0040
|
||||
|
||||
#define VM_FAULT_NOPAGE 0x0100 /* ->fault installed the pte, not return page */
|
||||
#define VM_FAULT_LOCKED 0x0200 /* ->fault locked the returned page */
|
||||
@@ -901,8 +902,8 @@ static inline int page_mapped(struct page *page)
|
||||
|
||||
#define VM_FAULT_HWPOISON_LARGE_MASK 0xf000 /* encodes hpage index for large hwpoison */
|
||||
|
||||
#define VM_FAULT_ERROR (VM_FAULT_OOM | VM_FAULT_SIGBUS | VM_FAULT_HWPOISON | \
|
||||
VM_FAULT_HWPOISON_LARGE)
|
||||
#define VM_FAULT_ERROR (VM_FAULT_OOM | VM_FAULT_SIGBUS | VM_FAULT_SIGSEGV | \
|
||||
VM_FAULT_HWPOISON | VM_FAULT_HWPOISON_LARGE)
|
||||
|
||||
/* Encode hstate index for a hwpoisoned large page */
|
||||
#define VM_FAULT_SET_HINDEX(x) ((x) << 12)
|
||||
|
||||
+1
-1
@@ -984,7 +984,7 @@ static void cgroup_d_remove_dir(struct dentry *dentry)
|
||||
parent = dentry->d_parent;
|
||||
spin_lock(&parent->d_lock);
|
||||
spin_lock_nested(&dentry->d_lock, DENTRY_D_LOCK_NESTED);
|
||||
list_del_init(&dentry->d_u.d_child);
|
||||
list_del_init(&dentry->d_child);
|
||||
spin_unlock(&dentry->d_lock);
|
||||
spin_unlock(&parent->d_lock);
|
||||
remove_dir(dentry);
|
||||
|
||||
@@ -6306,7 +6306,7 @@ static int instance_mkdir (struct inode *inode, struct dentry *dentry, umode_t m
|
||||
int ret;
|
||||
|
||||
/* Paranoid: Make sure the parent is the "instances" directory */
|
||||
parent = hlist_entry(inode->i_dentry.first, struct dentry, d_alias);
|
||||
parent = hlist_entry(inode->i_dentry.first, struct dentry, d_u.d_alias);
|
||||
if (WARN_ON_ONCE(parent != trace_instance_dir))
|
||||
return -ENOENT;
|
||||
|
||||
@@ -6333,7 +6333,7 @@ static int instance_rmdir(struct inode *inode, struct dentry *dentry)
|
||||
int ret;
|
||||
|
||||
/* Paranoid: Make sure the parent is the "instances" directory */
|
||||
parent = hlist_entry(inode->i_dentry.first, struct dentry, d_alias);
|
||||
parent = hlist_entry(inode->i_dentry.first, struct dentry, d_u.d_alias);
|
||||
if (WARN_ON_ONCE(parent != trace_instance_dir))
|
||||
return -ENOENT;
|
||||
|
||||
|
||||
@@ -430,7 +430,7 @@ static void remove_event_file_dir(struct ftrace_event_file *file)
|
||||
|
||||
if (dir) {
|
||||
spin_lock(&dir->d_lock); /* probably unneeded */
|
||||
list_for_each_entry(child, &dir->d_subdirs, d_u.d_child) {
|
||||
list_for_each_entry(child, &dir->d_subdirs, d_child) {
|
||||
if (child->d_inode) /* probably unneeded */
|
||||
child->d_inode->i_private = NULL;
|
||||
}
|
||||
|
||||
@@ -376,7 +376,7 @@ static int break_ksm(struct vm_area_struct *vma, unsigned long addr)
|
||||
else
|
||||
ret = VM_FAULT_WRITE;
|
||||
put_page(page);
|
||||
} while (!(ret & (VM_FAULT_WRITE | VM_FAULT_SIGBUS | VM_FAULT_OOM)));
|
||||
} while (!(ret & (VM_FAULT_WRITE | VM_FAULT_SIGBUS | VM_FAULT_SIGSEGV | VM_FAULT_OOM)));
|
||||
/*
|
||||
* We must loop because handle_mm_fault() may back out if there's
|
||||
* any difficulty e.g. if pte accessed bit gets updated concurrently.
|
||||
|
||||
+4
-3
@@ -1873,7 +1873,8 @@ long __get_user_pages(struct task_struct *tsk, struct mm_struct *mm,
|
||||
else
|
||||
return -EFAULT;
|
||||
}
|
||||
if (ret & VM_FAULT_SIGBUS)
|
||||
if (ret & (VM_FAULT_SIGBUS |
|
||||
VM_FAULT_SIGSEGV))
|
||||
return i ? i : -EFAULT;
|
||||
BUG();
|
||||
}
|
||||
@@ -1983,7 +1984,7 @@ int fixup_user_fault(struct task_struct *tsk, struct mm_struct *mm,
|
||||
return -ENOMEM;
|
||||
if (ret & (VM_FAULT_HWPOISON | VM_FAULT_HWPOISON_LARGE))
|
||||
return -EHWPOISON;
|
||||
if (ret & VM_FAULT_SIGBUS)
|
||||
if (ret & (VM_FAULT_SIGBUS | VM_FAULT_SIGSEGV))
|
||||
return -EFAULT;
|
||||
BUG();
|
||||
}
|
||||
@@ -3270,7 +3271,7 @@ static int do_anonymous_page(struct mm_struct *mm, struct vm_area_struct *vma,
|
||||
|
||||
/* Check if we need to add a guard page to the stack */
|
||||
if (check_stack_guard_page(vma, address) < 0)
|
||||
return VM_FAULT_SIGBUS;
|
||||
return VM_FAULT_SIGSEGV;
|
||||
|
||||
/* Use the zero-page for reads */
|
||||
if (!(flags & FAULT_FLAG_WRITE)) {
|
||||
|
||||
@@ -23,7 +23,6 @@
|
||||
#define ALPHA_MIN ((3*ALPHA_SCALE)/10) /* ~0.3 */
|
||||
#define ALPHA_MAX (10*ALPHA_SCALE) /* 10.0 */
|
||||
#define ALPHA_BASE ALPHA_SCALE /* 1.0 */
|
||||
#define U32_MAX ((u32)~0U)
|
||||
#define RTT_MAX (U32_MAX / ALPHA_MAX) /* 3.3 secs */
|
||||
|
||||
#define BETA_SHIFT 6
|
||||
|
||||
@@ -3112,10 +3112,11 @@ static int tcp_clean_rtx_queue(struct sock *sk, int prior_fackets,
|
||||
if (seq_rtt < 0) {
|
||||
seq_rtt = ca_seq_rtt;
|
||||
}
|
||||
if (!(sacked & TCPCB_SACKED_ACKED))
|
||||
if (!(sacked & TCPCB_SACKED_ACKED)) {
|
||||
reord = min(pkts_acked, reord);
|
||||
if (!after(scb->end_seq, tp->high_seq))
|
||||
flag |= FLAG_ORIG_SACK_ACKED;
|
||||
if (!after(scb->end_seq, tp->high_seq))
|
||||
flag |= FLAG_ORIG_SACK_ACKED;
|
||||
}
|
||||
}
|
||||
|
||||
if (sacked & TCPCB_SACKED_ACKED)
|
||||
|
||||
+1
-1
@@ -1902,7 +1902,7 @@ void tcp_v4_early_demux(struct sk_buff *skb)
|
||||
skb->sk = sk;
|
||||
skb->destructor = sock_edemux;
|
||||
if (sk->sk_state != TCP_TIME_WAIT) {
|
||||
struct dst_entry *dst = sk->sk_rx_dst;
|
||||
struct dst_entry *dst = ACCESS_ONCE(sk->sk_rx_dst);
|
||||
|
||||
if (dst)
|
||||
dst = dst_check(dst, 0);
|
||||
|
||||
@@ -2771,6 +2771,8 @@ struct sk_buff *tcp_make_synack(struct sock *sk, struct dst_entry *dst,
|
||||
}
|
||||
#endif
|
||||
|
||||
/* Do not fool tcpdump (if any), clean our debris */
|
||||
skb->tstamp.tv64 = 0;
|
||||
return skb;
|
||||
}
|
||||
EXPORT_SYMBOL(tcp_make_synack);
|
||||
|
||||
+3
-2
@@ -1196,10 +1196,11 @@ static void ndisc_router_discovery(struct sk_buff *skb)
|
||||
/* Only set hop_limit on the interface if it is higher than
|
||||
* the current hop_limit.
|
||||
*/
|
||||
if (in6_dev->cnf.hop_limit < ra_msg->icmph.icmp6_hop_limit)
|
||||
if (in6_dev->cnf.hop_limit < ra_msg->icmph.icmp6_hop_limit) {
|
||||
in6_dev->cnf.hop_limit = ra_msg->icmph.icmp6_hop_limit;
|
||||
else
|
||||
} else {
|
||||
ND_PRINTK(2, warn, "RA: Got route advertisement with lower hop_limit than current\n");
|
||||
}
|
||||
if (rt)
|
||||
dst_metric_set(&rt->dst, RTAX_HOPLIMIT,
|
||||
ra_msg->icmph.icmp6_hop_limit);
|
||||
|
||||
+1
-1
@@ -1620,7 +1620,7 @@ static void tcp_v6_early_demux(struct sk_buff *skb)
|
||||
skb->sk = sk;
|
||||
skb->destructor = sock_edemux;
|
||||
if (sk->sk_state != TCP_TIME_WAIT) {
|
||||
struct dst_entry *dst = sk->sk_rx_dst;
|
||||
struct dst_entry *dst = ACCESS_ONCE(sk->sk_rx_dst);
|
||||
|
||||
if (dst)
|
||||
dst = dst_check(dst, inet6_sk(sk)->rx_dst_cookie);
|
||||
|
||||
@@ -14,6 +14,30 @@
|
||||
|
||||
static unsigned int nf_ct_generic_timeout __read_mostly = 600*HZ;
|
||||
|
||||
static bool nf_generic_should_process(u8 proto)
|
||||
{
|
||||
switch (proto) {
|
||||
#ifdef CONFIG_NF_CT_PROTO_SCTP_MODULE
|
||||
case IPPROTO_SCTP:
|
||||
return false;
|
||||
#endif
|
||||
#ifdef CONFIG_NF_CT_PROTO_DCCP_MODULE
|
||||
case IPPROTO_DCCP:
|
||||
return false;
|
||||
#endif
|
||||
#ifdef CONFIG_NF_CT_PROTO_GRE_MODULE
|
||||
case IPPROTO_GRE:
|
||||
return false;
|
||||
#endif
|
||||
#ifdef CONFIG_NF_CT_PROTO_UDPLITE_MODULE
|
||||
case IPPROTO_UDPLITE:
|
||||
return false;
|
||||
#endif
|
||||
default:
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
static inline struct nf_generic_net *generic_pernet(struct net *net)
|
||||
{
|
||||
return &net->ct.nf_ct_proto.generic;
|
||||
@@ -67,7 +91,7 @@ static int generic_packet(struct nf_conn *ct,
|
||||
static bool generic_new(struct nf_conn *ct, const struct sk_buff *skb,
|
||||
unsigned int dataoff, unsigned int *timeouts)
|
||||
{
|
||||
return true;
|
||||
return nf_generic_should_process(nf_ct_protonum(ct));
|
||||
}
|
||||
|
||||
#if IS_ENABLED(CONFIG_NF_CT_NETLINK_TIMEOUT)
|
||||
|
||||
@@ -563,7 +563,7 @@ static void get_prompt_str(struct gstr *r, struct property *prop,
|
||||
str_printf(r, _(" Location:\n"));
|
||||
for (j = 4; --i >= 0; j += 2) {
|
||||
menu = submenu[i];
|
||||
if (head && location && menu == location)
|
||||
if (jump && menu == location)
|
||||
jump->offset = r->len - 1;
|
||||
str_printf(r, "%*c-> %s", j, ' ',
|
||||
_(menu_get_prompt(menu)));
|
||||
|
||||
@@ -1190,7 +1190,7 @@ static void sel_remove_entries(struct dentry *de)
|
||||
spin_lock(&de->d_lock);
|
||||
node = de->d_subdirs.next;
|
||||
while (node != &de->d_subdirs) {
|
||||
struct dentry *d = list_entry(node, struct dentry, d_u.d_child);
|
||||
struct dentry *d = list_entry(node, struct dentry, d_child);
|
||||
|
||||
spin_lock_nested(&d->d_lock, DENTRY_D_LOCK_NESTED);
|
||||
list_del_init(node);
|
||||
@@ -1664,12 +1664,12 @@ static void sel_remove_classes(void)
|
||||
|
||||
list_for_each(class_node, &class_dir->d_subdirs) {
|
||||
struct dentry *class_subdir = list_entry(class_node,
|
||||
struct dentry, d_u.d_child);
|
||||
struct dentry, d_child);
|
||||
struct list_head *class_subdir_node;
|
||||
|
||||
list_for_each(class_subdir_node, &class_subdir->d_subdirs) {
|
||||
struct dentry *d = list_entry(class_subdir_node,
|
||||
struct dentry, d_u.d_child);
|
||||
struct dentry, d_child);
|
||||
|
||||
if (d->d_inode)
|
||||
if (d->d_inode->i_mode & S_IFDIR)
|
||||
|
||||
Reference in New Issue
Block a user