mirror of
https://github.com/hardkernel/linux.git
synced 2026-03-24 19:40:21 +09:00
Merge tag 'v4.9.263' of git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable into odroidg12-4.9.y
This is the 4.9.263 stable release
This commit is contained in:
2
Makefile
2
Makefile
@@ -1,6 +1,6 @@
|
||||
VERSION = 4
|
||||
PATCHLEVEL = 9
|
||||
SUBLEVEL = 262
|
||||
SUBLEVEL = 263
|
||||
EXTRAVERSION =
|
||||
NAME = Roaring Lionus
|
||||
|
||||
|
||||
@@ -1473,7 +1473,7 @@ static void intel_pmu_drain_pebs_nhm(struct pt_regs *iregs)
|
||||
*/
|
||||
if (!pebs_status && cpuc->pebs_enabled &&
|
||||
!(cpuc->pebs_enabled & (cpuc->pebs_enabled-1)))
|
||||
pebs_status = cpuc->pebs_enabled;
|
||||
pebs_status = p->status = cpuc->pebs_enabled;
|
||||
|
||||
bit = find_first_bit((unsigned long *)&pebs_status,
|
||||
x86_pmu.max_pebs_events);
|
||||
|
||||
@@ -461,15 +461,6 @@ struct thread_struct {
|
||||
*/
|
||||
};
|
||||
|
||||
/*
|
||||
* Thread-synchronous status.
|
||||
*
|
||||
* This is different from the flags in that nobody else
|
||||
* ever touches our thread-synchronous status, so we don't
|
||||
* have to worry about atomic accesses.
|
||||
*/
|
||||
#define TS_COMPAT 0x0002 /* 32bit syscall active (64BIT)*/
|
||||
|
||||
/*
|
||||
* Set IOPL bits in EFLAGS from given mask
|
||||
*/
|
||||
|
||||
@@ -221,10 +221,31 @@ static inline int arch_within_stack_frames(const void * const stack,
|
||||
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Thread-synchronous status.
|
||||
*
|
||||
* This is different from the flags in that nobody else
|
||||
* ever touches our thread-synchronous status, so we don't
|
||||
* have to worry about atomic accesses.
|
||||
*/
|
||||
#define TS_COMPAT 0x0002 /* 32bit syscall active (64BIT)*/
|
||||
|
||||
#ifndef __ASSEMBLY__
|
||||
#ifdef CONFIG_COMPAT
|
||||
#define TS_I386_REGS_POKED 0x0004 /* regs poked by 32-bit ptracer */
|
||||
#define TS_COMPAT_RESTART 0x0008
|
||||
|
||||
#define arch_set_restart_data arch_set_restart_data
|
||||
|
||||
static inline void arch_set_restart_data(struct restart_block *restart)
|
||||
{
|
||||
struct thread_info *ti = current_thread_info();
|
||||
if (ti->status & TS_COMPAT)
|
||||
ti->status |= TS_COMPAT_RESTART;
|
||||
else
|
||||
ti->status &= ~TS_COMPAT_RESTART;
|
||||
}
|
||||
#endif
|
||||
#ifndef __ASSEMBLY__
|
||||
|
||||
#ifdef CONFIG_X86_32
|
||||
#define in_ia32_syscall() true
|
||||
|
||||
@@ -1042,6 +1042,16 @@ static int mp_map_pin_to_irq(u32 gsi, int idx, int ioapic, int pin,
|
||||
if (idx >= 0 && test_bit(mp_irqs[idx].srcbus, mp_bus_not_pci)) {
|
||||
irq = mp_irqs[idx].srcbusirq;
|
||||
legacy = mp_is_legacy_irq(irq);
|
||||
/*
|
||||
* IRQ2 is unusable for historical reasons on systems which
|
||||
* have a legacy PIC. See the comment vs. IRQ2 further down.
|
||||
*
|
||||
* If this gets removed at some point then the related code
|
||||
* in lapic_assign_system_vectors() needs to be adjusted as
|
||||
* well.
|
||||
*/
|
||||
if (legacy && irq == PIC_CASCADE_IR)
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
mutex_lock(&ioapic_mutex);
|
||||
|
||||
@@ -767,30 +767,8 @@ handle_signal(struct ksignal *ksig, struct pt_regs *regs)
|
||||
|
||||
static inline unsigned long get_nr_restart_syscall(const struct pt_regs *regs)
|
||||
{
|
||||
/*
|
||||
* This function is fundamentally broken as currently
|
||||
* implemented.
|
||||
*
|
||||
* The idea is that we want to trigger a call to the
|
||||
* restart_block() syscall and that we want in_ia32_syscall(),
|
||||
* in_x32_syscall(), etc. to match whatever they were in the
|
||||
* syscall being restarted. We assume that the syscall
|
||||
* instruction at (regs->ip - 2) matches whatever syscall
|
||||
* instruction we used to enter in the first place.
|
||||
*
|
||||
* The problem is that we can get here when ptrace pokes
|
||||
* syscall-like values into regs even if we're not in a syscall
|
||||
* at all.
|
||||
*
|
||||
* For now, we maintain historical behavior and guess based on
|
||||
* stored state. We could do better by saving the actual
|
||||
* syscall arch in restart_block or (with caveats on x32) by
|
||||
* checking if regs->ip points to 'int $0x80'. The current
|
||||
* behavior is incorrect if a tracer has a different bitness
|
||||
* than the tracee.
|
||||
*/
|
||||
#ifdef CONFIG_IA32_EMULATION
|
||||
if (current_thread_info()->status & (TS_COMPAT|TS_I386_REGS_POKED))
|
||||
if (current_thread_info()->status & TS_COMPAT_RESTART)
|
||||
return __NR_ia32_restart_syscall;
|
||||
#endif
|
||||
#ifdef CONFIG_X86_X32_ABI
|
||||
|
||||
@@ -350,7 +350,7 @@ typedef struct {
|
||||
uByte bDescriptorType;
|
||||
uWord bString[127];
|
||||
} UPACKED usb_string_descriptor_t;
|
||||
#define USB_MAX_STRING_LEN 128
|
||||
|
||||
#define USB_LANGUAGE_TABLE 0 /* # of the string language id table */
|
||||
|
||||
/* Hub specific request */
|
||||
@@ -682,8 +682,8 @@ struct usb_device_info {
|
||||
u_int8_t udi_bus;
|
||||
u_int8_t udi_addr; /* device address */
|
||||
usb_event_cookie_t udi_cookie;
|
||||
char udi_product[USB_MAX_STRING_LEN];
|
||||
char udi_vendor[USB_MAX_STRING_LEN];
|
||||
char udi_product[128];
|
||||
char udi_vendor[128];
|
||||
char udi_release[8];
|
||||
u_int16_t udi_productNo;
|
||||
u_int16_t udi_vendorNo;
|
||||
|
||||
@@ -288,8 +288,7 @@ static int adis16400_initial_setup(struct iio_dev *indio_dev)
|
||||
if (ret)
|
||||
goto err_ret;
|
||||
|
||||
ret = sscanf(indio_dev->name, "adis%u\n", &device_id);
|
||||
if (ret != 1) {
|
||||
if (sscanf(indio_dev->name, "adis%u\n", &device_id) != 1) {
|
||||
ret = -EINVAL;
|
||||
goto err_ret;
|
||||
}
|
||||
|
||||
@@ -502,6 +502,19 @@ static void b53_imp_vlan_setup(struct dsa_switch *ds, int cpu_port)
|
||||
}
|
||||
}
|
||||
|
||||
static void b53_port_set_learning(struct b53_device *dev, int port,
|
||||
bool learning)
|
||||
{
|
||||
u16 reg;
|
||||
|
||||
b53_read16(dev, B53_CTRL_PAGE, B53_DIS_LEARNING, ®);
|
||||
if (learning)
|
||||
reg &= ~BIT(port);
|
||||
else
|
||||
reg |= BIT(port);
|
||||
b53_write16(dev, B53_CTRL_PAGE, B53_DIS_LEARNING, reg);
|
||||
}
|
||||
|
||||
static int b53_enable_port(struct dsa_switch *ds, int port,
|
||||
struct phy_device *phy)
|
||||
{
|
||||
@@ -509,6 +522,8 @@ static int b53_enable_port(struct dsa_switch *ds, int port,
|
||||
unsigned int cpu_port = dev->cpu_port;
|
||||
u16 pvlan;
|
||||
|
||||
b53_port_set_learning(dev, port, false);
|
||||
|
||||
/* Clear the Rx and Tx disable bits and set to no spanning tree */
|
||||
b53_write8(dev, B53_CTRL_PAGE, B53_PORT_CTRL(port), 0);
|
||||
|
||||
@@ -552,6 +567,8 @@ static void b53_enable_cpu_port(struct b53_device *dev)
|
||||
PORT_CTRL_RX_MCST_EN |
|
||||
PORT_CTRL_RX_UCST_EN;
|
||||
b53_write8(dev, B53_CTRL_PAGE, B53_PORT_CTRL(cpu_port), port_ctrl);
|
||||
|
||||
b53_port_set_learning(dev, cpu_port, false);
|
||||
}
|
||||
|
||||
static void b53_enable_mib(struct b53_device *dev)
|
||||
@@ -1375,6 +1392,8 @@ static int b53_br_join(struct dsa_switch *ds, int port,
|
||||
b53_write16(dev, B53_PVLAN_PAGE, B53_PVLAN_PORT_MASK(port), pvlan);
|
||||
dev->ports[port].vlan_ctl_mask = pvlan;
|
||||
|
||||
b53_port_set_learning(dev, port, true);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -1426,6 +1445,7 @@ static void b53_br_leave(struct dsa_switch *ds, int port)
|
||||
vl->untag |= BIT(port) | BIT(dev->cpu_port);
|
||||
b53_set_vlan_entry(dev, pvid, vl);
|
||||
}
|
||||
b53_port_set_learning(dev, port, false);
|
||||
}
|
||||
|
||||
static void b53_br_set_stp_state(struct dsa_switch *ds, int port, u8 state)
|
||||
|
||||
@@ -112,6 +112,7 @@
|
||||
#define B53_UC_FLOOD_MASK 0x32
|
||||
#define B53_MC_FLOOD_MASK 0x34
|
||||
#define B53_IPMC_FLOOD_MASK 0x36
|
||||
#define B53_DIS_LEARNING 0x3c
|
||||
|
||||
/*
|
||||
* Override Ports 0-7 State on devices with xMII interfaces (8 bit)
|
||||
|
||||
@@ -224,6 +224,11 @@ static int bcm_sf2_port_setup(struct dsa_switch *ds, int port,
|
||||
reg &= ~P_TXQ_PSM_VDD(port);
|
||||
core_writel(priv, reg, CORE_MEM_PSM_VDD_CTRL);
|
||||
|
||||
/* Disable learning */
|
||||
reg = core_readl(priv, CORE_DIS_LEARN);
|
||||
reg |= BIT(port);
|
||||
core_writel(priv, reg, CORE_DIS_LEARN);
|
||||
|
||||
/* Clear the Rx and Tx disable bits and set to no spanning tree */
|
||||
core_writel(priv, 0, CORE_G_PCTL_PORT(port));
|
||||
|
||||
|
||||
@@ -138,6 +138,8 @@
|
||||
#define CORE_SWITCH_CTRL 0x00088
|
||||
#define MII_DUMB_FWDG_EN (1 << 6)
|
||||
|
||||
#define CORE_DIS_LEARN 0x000f0
|
||||
|
||||
#define CORE_SFT_LRN_CTRL 0x000f8
|
||||
#define SW_LEARN_CNTL(x) (1 << (x))
|
||||
|
||||
|
||||
@@ -991,6 +991,7 @@ void ixgbe_ptp_suspend(struct ixgbe_adapter *adapter);
|
||||
void ixgbe_ptp_stop(struct ixgbe_adapter *adapter);
|
||||
void ixgbe_ptp_overflow_check(struct ixgbe_adapter *adapter);
|
||||
void ixgbe_ptp_rx_hang(struct ixgbe_adapter *adapter);
|
||||
void ixgbe_ptp_tx_hang(struct ixgbe_adapter *adapter);
|
||||
void ixgbe_ptp_rx_pktstamp(struct ixgbe_q_vector *, struct sk_buff *);
|
||||
void ixgbe_ptp_rx_rgtstamp(struct ixgbe_q_vector *, struct sk_buff *skb);
|
||||
static inline void ixgbe_ptp_rx_hwtstamp(struct ixgbe_ring *rx_ring,
|
||||
|
||||
@@ -7257,7 +7257,9 @@ static void ixgbe_service_task(struct work_struct *work)
|
||||
|
||||
if (test_bit(__IXGBE_PTP_RUNNING, &adapter->state)) {
|
||||
ixgbe_ptp_overflow_check(adapter);
|
||||
ixgbe_ptp_rx_hang(adapter);
|
||||
if (adapter->flags & IXGBE_FLAG_RX_HWTSTAMP_IN_REGISTER)
|
||||
ixgbe_ptp_rx_hang(adapter);
|
||||
ixgbe_ptp_tx_hang(adapter);
|
||||
}
|
||||
|
||||
ixgbe_service_event_complete(adapter);
|
||||
|
||||
@@ -662,6 +662,33 @@ static void ixgbe_ptp_clear_tx_timestamp(struct ixgbe_adapter *adapter)
|
||||
clear_bit_unlock(__IXGBE_PTP_TX_IN_PROGRESS, &adapter->state);
|
||||
}
|
||||
|
||||
/**
|
||||
* ixgbe_ptp_tx_hang - detect error case where Tx timestamp never finishes
|
||||
* @adapter: private network adapter structure
|
||||
*/
|
||||
void ixgbe_ptp_tx_hang(struct ixgbe_adapter *adapter)
|
||||
{
|
||||
bool timeout = time_is_before_jiffies(adapter->ptp_tx_start +
|
||||
IXGBE_PTP_TX_TIMEOUT);
|
||||
|
||||
if (!adapter->ptp_tx_skb)
|
||||
return;
|
||||
|
||||
if (!test_bit(__IXGBE_PTP_TX_IN_PROGRESS, &adapter->state))
|
||||
return;
|
||||
|
||||
/* If we haven't received a timestamp within the timeout, it is
|
||||
* reasonable to assume that it will never occur, so we can unlock the
|
||||
* timestamp bit when this occurs.
|
||||
*/
|
||||
if (timeout) {
|
||||
cancel_work_sync(&adapter->ptp_tx_work);
|
||||
ixgbe_ptp_clear_tx_timestamp(adapter);
|
||||
adapter->tx_hwtstamp_timeouts++;
|
||||
e_warn(drv, "clearing Tx timestamp hang\n");
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* ixgbe_ptp_tx_hwtstamp - utility function which checks for TX time stamp
|
||||
* @adapter: the private adapter struct
|
||||
|
||||
@@ -574,9 +574,20 @@ static void nvmet_start_ctrl(struct nvmet_ctrl *ctrl)
|
||||
{
|
||||
lockdep_assert_held(&ctrl->lock);
|
||||
|
||||
if (nvmet_cc_iosqes(ctrl->cc) != NVME_NVM_IOSQES ||
|
||||
nvmet_cc_iocqes(ctrl->cc) != NVME_NVM_IOCQES ||
|
||||
nvmet_cc_mps(ctrl->cc) != 0 ||
|
||||
/*
|
||||
* Only I/O controllers should verify iosqes,iocqes.
|
||||
* Strictly speaking, the spec says a discovery controller
|
||||
* should verify iosqes,iocqes are zeroed, however that
|
||||
* would break backwards compatibility, so don't enforce it.
|
||||
*/
|
||||
if (ctrl->subsys->type != NVME_NQN_DISC &&
|
||||
(nvmet_cc_iosqes(ctrl->cc) != NVME_NVM_IOSQES ||
|
||||
nvmet_cc_iocqes(ctrl->cc) != NVME_NVM_IOCQES)) {
|
||||
ctrl->csts = NVME_CSTS_CFS;
|
||||
return;
|
||||
}
|
||||
|
||||
if (nvmet_cc_mps(ctrl->cc) != 0 ||
|
||||
nvmet_cc_ams(ctrl->cc) != 0 ||
|
||||
nvmet_cc_css(ctrl->cc) != 0) {
|
||||
ctrl->csts = NVME_CSTS_CFS;
|
||||
|
||||
@@ -39,12 +39,11 @@ static ssize_t add_slot_store(struct kobject *kobj, struct kobj_attribute *attr,
|
||||
if (nbytes >= MAX_DRC_NAME_LEN)
|
||||
return 0;
|
||||
|
||||
memcpy(drc_name, buf, nbytes);
|
||||
strscpy(drc_name, buf, nbytes + 1);
|
||||
|
||||
end = strchr(drc_name, '\n');
|
||||
if (!end)
|
||||
end = &drc_name[nbytes];
|
||||
*end = '\0';
|
||||
if (end)
|
||||
*end = '\0';
|
||||
|
||||
rc = dlpar_add_slot(drc_name);
|
||||
if (rc)
|
||||
@@ -70,12 +69,11 @@ static ssize_t remove_slot_store(struct kobject *kobj,
|
||||
if (nbytes >= MAX_DRC_NAME_LEN)
|
||||
return 0;
|
||||
|
||||
memcpy(drc_name, buf, nbytes);
|
||||
strscpy(drc_name, buf, nbytes + 1);
|
||||
|
||||
end = strchr(drc_name, '\n');
|
||||
if (!end)
|
||||
end = &drc_name[nbytes];
|
||||
*end = '\0';
|
||||
if (end)
|
||||
*end = '\0';
|
||||
|
||||
rc = dlpar_remove_slot(drc_name);
|
||||
if (rc)
|
||||
|
||||
@@ -1061,7 +1061,7 @@ lpfc_debugfs_dif_err_write(struct file *file, const char __user *buf,
|
||||
memset(dstbuf, 0, 33);
|
||||
size = (nbytes < 32) ? nbytes : 32;
|
||||
if (copy_from_user(dstbuf, buf, size))
|
||||
return 0;
|
||||
return -EFAULT;
|
||||
|
||||
if (dent == phba->debug_InjErrLBA) {
|
||||
if ((buf[0] == 'o') && (buf[1] == 'f') && (buf[2] == 'f'))
|
||||
@@ -1069,7 +1069,7 @@ lpfc_debugfs_dif_err_write(struct file *file, const char __user *buf,
|
||||
}
|
||||
|
||||
if ((tmp == 0) && (kstrtoull(dstbuf, 0, &tmp)))
|
||||
return 0;
|
||||
return -EINVAL;
|
||||
|
||||
if (dent == phba->debug_writeGuard)
|
||||
phba->lpfc_injerr_wgrd_cnt = (uint32_t)tmp;
|
||||
|
||||
@@ -1076,7 +1076,7 @@ static void collect_langs(struct usb_gadget_strings **sp, __le16 *buf)
|
||||
while (*sp) {
|
||||
s = *sp;
|
||||
language = cpu_to_le16(s->language);
|
||||
for (tmp = buf; *tmp && tmp < &buf[126]; tmp++) {
|
||||
for (tmp = buf; *tmp && tmp < &buf[USB_MAX_STRING_LEN]; tmp++) {
|
||||
if (*tmp == language)
|
||||
goto repeat;
|
||||
}
|
||||
@@ -1151,7 +1151,7 @@ static int get_string(struct usb_composite_dev *cdev,
|
||||
collect_langs(sp, s->wData);
|
||||
}
|
||||
|
||||
for (len = 0; len <= 126 && s->wData[len]; len++)
|
||||
for (len = 0; len <= USB_MAX_STRING_LEN && s->wData[len]; len++)
|
||||
continue;
|
||||
if (!len)
|
||||
return -EINVAL;
|
||||
|
||||
@@ -166,21 +166,27 @@ struct gadget_config_name {
|
||||
struct list_head list;
|
||||
};
|
||||
|
||||
#define USB_MAX_STRING_WITH_NULL_LEN (USB_MAX_STRING_LEN+1)
|
||||
|
||||
static int usb_string_copy(const char *s, char **s_copy)
|
||||
{
|
||||
int ret;
|
||||
char *str;
|
||||
char *copy = *s_copy;
|
||||
ret = strlen(s);
|
||||
if (ret > 126)
|
||||
if (ret > USB_MAX_STRING_LEN)
|
||||
return -EOVERFLOW;
|
||||
|
||||
str = kstrdup(s, GFP_KERNEL);
|
||||
if (!str)
|
||||
return -ENOMEM;
|
||||
if (copy) {
|
||||
str = copy;
|
||||
} else {
|
||||
str = kmalloc(USB_MAX_STRING_WITH_NULL_LEN, GFP_KERNEL);
|
||||
if (!str)
|
||||
return -ENOMEM;
|
||||
}
|
||||
strcpy(str, s);
|
||||
if (str[ret - 1] == '\n')
|
||||
str[ret - 1] = '\0';
|
||||
kfree(copy);
|
||||
*s_copy = str;
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -59,9 +59,9 @@ usb_gadget_get_string (struct usb_gadget_strings *table, int id, u8 *buf)
|
||||
return -EINVAL;
|
||||
|
||||
/* string descriptors have length, tag, then UTF16-LE text */
|
||||
len = min ((size_t) 126, strlen (s->s));
|
||||
len = min((size_t)USB_MAX_STRING_LEN, strlen(s->s));
|
||||
len = utf8s_to_utf16s(s->s, len, UTF16_LITTLE_ENDIAN,
|
||||
(wchar_t *) &buf[2], 126);
|
||||
(wchar_t *) &buf[2], USB_MAX_STRING_LEN);
|
||||
if (len < 0)
|
||||
return -EINVAL;
|
||||
buf [0] = (len + 1) * 2;
|
||||
|
||||
@@ -1422,7 +1422,9 @@ get_old_root(struct btrfs_root *root, u64 time_seq)
|
||||
btrfs_warn(root->fs_info,
|
||||
"failed to read tree block %llu from get_old_root", logical);
|
||||
} else {
|
||||
btrfs_tree_read_lock(old);
|
||||
eb = btrfs_clone_extent_buffer(old);
|
||||
btrfs_tree_read_unlock(old);
|
||||
free_extent_buffer(old);
|
||||
}
|
||||
} else if (old_root) {
|
||||
|
||||
@@ -23,6 +23,7 @@ struct ext4_system_zone {
|
||||
struct rb_node node;
|
||||
ext4_fsblk_t start_blk;
|
||||
unsigned int count;
|
||||
u32 ino;
|
||||
};
|
||||
|
||||
static struct kmem_cache *ext4_system_zone_cachep;
|
||||
@@ -43,7 +44,8 @@ void ext4_exit_system_zone(void)
|
||||
static inline int can_merge(struct ext4_system_zone *entry1,
|
||||
struct ext4_system_zone *entry2)
|
||||
{
|
||||
if ((entry1->start_blk + entry1->count) == entry2->start_blk)
|
||||
if ((entry1->start_blk + entry1->count) == entry2->start_blk &&
|
||||
entry1->ino == entry2->ino)
|
||||
return 1;
|
||||
return 0;
|
||||
}
|
||||
@@ -55,9 +57,9 @@ static inline int can_merge(struct ext4_system_zone *entry1,
|
||||
*/
|
||||
static int add_system_zone(struct ext4_sb_info *sbi,
|
||||
ext4_fsblk_t start_blk,
|
||||
unsigned int count)
|
||||
unsigned int count, u32 ino)
|
||||
{
|
||||
struct ext4_system_zone *new_entry = NULL, *entry;
|
||||
struct ext4_system_zone *new_entry, *entry;
|
||||
struct rb_node **n = &sbi->system_blks.rb_node, *node;
|
||||
struct rb_node *parent = NULL, *new_node = NULL;
|
||||
|
||||
@@ -68,30 +70,21 @@ static int add_system_zone(struct ext4_sb_info *sbi,
|
||||
n = &(*n)->rb_left;
|
||||
else if (start_blk >= (entry->start_blk + entry->count))
|
||||
n = &(*n)->rb_right;
|
||||
else {
|
||||
if (start_blk + count > (entry->start_blk +
|
||||
entry->count))
|
||||
entry->count = (start_blk + count -
|
||||
entry->start_blk);
|
||||
new_node = *n;
|
||||
new_entry = rb_entry(new_node, struct ext4_system_zone,
|
||||
node);
|
||||
break;
|
||||
}
|
||||
else /* Unexpected overlap of system zones. */
|
||||
return -EFSCORRUPTED;
|
||||
}
|
||||
|
||||
if (!new_entry) {
|
||||
new_entry = kmem_cache_alloc(ext4_system_zone_cachep,
|
||||
GFP_KERNEL);
|
||||
if (!new_entry)
|
||||
return -ENOMEM;
|
||||
new_entry->start_blk = start_blk;
|
||||
new_entry->count = count;
|
||||
new_node = &new_entry->node;
|
||||
new_entry = kmem_cache_alloc(ext4_system_zone_cachep,
|
||||
GFP_KERNEL);
|
||||
if (!new_entry)
|
||||
return -ENOMEM;
|
||||
new_entry->start_blk = start_blk;
|
||||
new_entry->count = count;
|
||||
new_entry->ino = ino;
|
||||
new_node = &new_entry->node;
|
||||
|
||||
rb_link_node(new_node, parent, n);
|
||||
rb_insert_color(new_node, &sbi->system_blks);
|
||||
}
|
||||
rb_link_node(new_node, parent, n);
|
||||
rb_insert_color(new_node, &sbi->system_blks);
|
||||
|
||||
/* Can we merge to the left? */
|
||||
node = rb_prev(new_node);
|
||||
@@ -163,16 +156,16 @@ static int ext4_protect_reserved_inode(struct super_block *sb, u32 ino)
|
||||
if (n == 0) {
|
||||
i++;
|
||||
} else {
|
||||
if (!ext4_data_block_valid(sbi, map.m_pblk, n)) {
|
||||
ext4_error(sb, "blocks %llu-%llu from inode %u "
|
||||
err = add_system_zone(sbi, map.m_pblk, n, ino);
|
||||
if (err < 0) {
|
||||
if (err == -EFSCORRUPTED) {
|
||||
ext4_error(sb,
|
||||
"blocks %llu-%llu from inode %u "
|
||||
"overlap system zone", map.m_pblk,
|
||||
map.m_pblk + map.m_len - 1, ino);
|
||||
err = -EFSCORRUPTED;
|
||||
}
|
||||
break;
|
||||
}
|
||||
err = add_system_zone(sbi, map.m_pblk, n);
|
||||
if (err < 0)
|
||||
break;
|
||||
i += n;
|
||||
}
|
||||
}
|
||||
@@ -201,16 +194,16 @@ int ext4_setup_system_zone(struct super_block *sb)
|
||||
if (ext4_bg_has_super(sb, i) &&
|
||||
((i < 5) || ((i % flex_size) == 0)))
|
||||
add_system_zone(sbi, ext4_group_first_block_no(sb, i),
|
||||
ext4_bg_num_gdb(sb, i) + 1);
|
||||
ext4_bg_num_gdb(sb, i) + 1, 0);
|
||||
gdp = ext4_get_group_desc(sb, i, NULL);
|
||||
ret = add_system_zone(sbi, ext4_block_bitmap(sb, gdp), 1);
|
||||
ret = add_system_zone(sbi, ext4_block_bitmap(sb, gdp), 1, 0);
|
||||
if (ret)
|
||||
return ret;
|
||||
ret = add_system_zone(sbi, ext4_inode_bitmap(sb, gdp), 1);
|
||||
ret = add_system_zone(sbi, ext4_inode_bitmap(sb, gdp), 1, 0);
|
||||
if (ret)
|
||||
return ret;
|
||||
ret = add_system_zone(sbi, ext4_inode_table(sb, gdp),
|
||||
sbi->s_itb_per_group);
|
||||
sbi->s_itb_per_group, 0);
|
||||
if (ret)
|
||||
return ret;
|
||||
}
|
||||
@@ -243,10 +236,11 @@ void ext4_release_system_zone(struct super_block *sb)
|
||||
* start_blk+count) is valid; 0 if some part of the block region
|
||||
* overlaps with filesystem metadata blocks.
|
||||
*/
|
||||
int ext4_data_block_valid(struct ext4_sb_info *sbi, ext4_fsblk_t start_blk,
|
||||
unsigned int count)
|
||||
int ext4_inode_block_valid(struct inode *inode, ext4_fsblk_t start_blk,
|
||||
unsigned int count)
|
||||
{
|
||||
struct ext4_system_zone *entry;
|
||||
struct ext4_sb_info *sbi = EXT4_SB(inode->i_sb);
|
||||
struct rb_node *n = sbi->system_blks.rb_node;
|
||||
|
||||
if ((start_blk <= le32_to_cpu(sbi->s_es->s_first_data_block)) ||
|
||||
@@ -262,6 +256,8 @@ int ext4_data_block_valid(struct ext4_sb_info *sbi, ext4_fsblk_t start_blk,
|
||||
else if (start_blk >= (entry->start_blk + entry->count))
|
||||
n = n->rb_right;
|
||||
else {
|
||||
if (entry->ino == inode->i_ino)
|
||||
return 1;
|
||||
sbi->s_es->s_last_error_block = cpu_to_le64(start_blk);
|
||||
return 0;
|
||||
}
|
||||
@@ -284,8 +280,7 @@ int ext4_check_blockref(const char *function, unsigned int line,
|
||||
while (bref < p+max) {
|
||||
blk = le32_to_cpu(*bref++);
|
||||
if (blk &&
|
||||
unlikely(!ext4_data_block_valid(EXT4_SB(inode->i_sb),
|
||||
blk, 1))) {
|
||||
unlikely(!ext4_inode_block_valid(inode, blk, 1))) {
|
||||
es->s_last_error_block = cpu_to_le64(blk);
|
||||
ext4_error_inode(inode, function, line, blk,
|
||||
"invalid block");
|
||||
|
||||
@@ -3126,9 +3126,9 @@ extern void ext4_release_system_zone(struct super_block *sb);
|
||||
extern int ext4_setup_system_zone(struct super_block *sb);
|
||||
extern int __init ext4_init_system_zone(void);
|
||||
extern void ext4_exit_system_zone(void);
|
||||
extern int ext4_data_block_valid(struct ext4_sb_info *sbi,
|
||||
ext4_fsblk_t start_blk,
|
||||
unsigned int count);
|
||||
extern int ext4_inode_block_valid(struct inode *inode,
|
||||
ext4_fsblk_t start_blk,
|
||||
unsigned int count);
|
||||
extern int ext4_check_blockref(const char *, unsigned int,
|
||||
struct inode *, __le32 *, unsigned int);
|
||||
|
||||
|
||||
@@ -389,7 +389,7 @@ static int ext4_valid_extent(struct inode *inode, struct ext4_extent *ext)
|
||||
*/
|
||||
if (lblock + len <= lblock)
|
||||
return 0;
|
||||
return ext4_data_block_valid(EXT4_SB(inode->i_sb), block, len);
|
||||
return ext4_inode_block_valid(inode, block, len);
|
||||
}
|
||||
|
||||
static int ext4_valid_extent_idx(struct inode *inode,
|
||||
@@ -397,7 +397,7 @@ static int ext4_valid_extent_idx(struct inode *inode,
|
||||
{
|
||||
ext4_fsblk_t block = ext4_idx_pblock(ext_idx);
|
||||
|
||||
return ext4_data_block_valid(EXT4_SB(inode->i_sb), block, 1);
|
||||
return ext4_inode_block_valid(inode, block, 1);
|
||||
}
|
||||
|
||||
static int ext4_valid_extent_entries(struct inode *inode,
|
||||
@@ -554,14 +554,10 @@ __read_extent_tree_block(const char *function, unsigned int line,
|
||||
}
|
||||
if (buffer_verified(bh) && !(flags & EXT4_EX_FORCE_CACHE))
|
||||
return bh;
|
||||
if (!ext4_has_feature_journal(inode->i_sb) ||
|
||||
(inode->i_ino !=
|
||||
le32_to_cpu(EXT4_SB(inode->i_sb)->s_es->s_journal_inum))) {
|
||||
err = __ext4_ext_check(function, line, inode,
|
||||
ext_block_hdr(bh), depth, pblk);
|
||||
if (err)
|
||||
goto errout;
|
||||
}
|
||||
err = __ext4_ext_check(function, line, inode,
|
||||
ext_block_hdr(bh), depth, pblk);
|
||||
if (err)
|
||||
goto errout;
|
||||
set_buffer_verified(bh);
|
||||
/*
|
||||
* If this is a leaf block, cache all of its entries
|
||||
|
||||
@@ -840,8 +840,7 @@ static int ext4_clear_blocks(handle_t *handle, struct inode *inode,
|
||||
else if (ext4_should_journal_data(inode))
|
||||
flags |= EXT4_FREE_BLOCKS_FORGET;
|
||||
|
||||
if (!ext4_data_block_valid(EXT4_SB(inode->i_sb), block_to_free,
|
||||
count)) {
|
||||
if (!ext4_inode_block_valid(inode, block_to_free, count)) {
|
||||
EXT4_ERROR_INODE(inode, "attempt to clear invalid "
|
||||
"blocks %llu len %lu",
|
||||
(unsigned long long) block_to_free, count);
|
||||
@@ -1003,8 +1002,7 @@ static void ext4_free_branches(handle_t *handle, struct inode *inode,
|
||||
if (!nr)
|
||||
continue; /* A hole */
|
||||
|
||||
if (!ext4_data_block_valid(EXT4_SB(inode->i_sb),
|
||||
nr, 1)) {
|
||||
if (!ext4_inode_block_valid(inode, nr, 1)) {
|
||||
EXT4_ERROR_INODE(inode,
|
||||
"invalid indirect mapped "
|
||||
"block %lu (level %d)",
|
||||
|
||||
@@ -379,8 +379,7 @@ static int __check_block_validity(struct inode *inode, const char *func,
|
||||
(inode->i_ino ==
|
||||
le32_to_cpu(EXT4_SB(inode->i_sb)->s_es->s_journal_inum)))
|
||||
return 0;
|
||||
if (!ext4_data_block_valid(EXT4_SB(inode->i_sb), map->m_pblk,
|
||||
map->m_len)) {
|
||||
if (!ext4_inode_block_valid(inode, map->m_pblk, map->m_len)) {
|
||||
ext4_error_inode(inode, func, line, map->m_pblk,
|
||||
"lblock %lu mapped to illegal pblock %llu "
|
||||
"(length %d)", (unsigned long) map->m_lblk,
|
||||
@@ -4811,7 +4810,7 @@ struct inode *__ext4_iget(struct super_block *sb, unsigned long ino,
|
||||
|
||||
ret = 0;
|
||||
if (ei->i_file_acl &&
|
||||
!ext4_data_block_valid(EXT4_SB(sb), ei->i_file_acl, 1)) {
|
||||
!ext4_inode_block_valid(inode, ei->i_file_acl, 1)) {
|
||||
ext4_error_inode(inode, function, line, 0,
|
||||
"iget: bad extended attribute block %llu",
|
||||
ei->i_file_acl);
|
||||
@@ -5001,7 +5000,7 @@ static int ext4_do_update_inode(handle_t *handle,
|
||||
struct ext4_inode_info *ei = EXT4_I(inode);
|
||||
struct buffer_head *bh = iloc->bh;
|
||||
struct super_block *sb = inode->i_sb;
|
||||
int err = 0, rc, block;
|
||||
int err = 0, block;
|
||||
int need_datasync = 0, set_large_file = 0;
|
||||
uid_t i_uid;
|
||||
gid_t i_gid;
|
||||
@@ -5111,9 +5110,9 @@ static int ext4_do_update_inode(handle_t *handle,
|
||||
bh->b_data);
|
||||
|
||||
BUFFER_TRACE(bh, "call ext4_handle_dirty_metadata");
|
||||
rc = ext4_handle_dirty_metadata(handle, NULL, bh);
|
||||
if (!err)
|
||||
err = rc;
|
||||
err = ext4_handle_dirty_metadata(handle, NULL, bh);
|
||||
if (err)
|
||||
goto out_brelse;
|
||||
ext4_clear_inode_state(inode, EXT4_STATE_NEW);
|
||||
if (set_large_file) {
|
||||
BUFFER_TRACE(EXT4_SB(sb)->s_sbh, "get write access");
|
||||
|
||||
@@ -2964,7 +2964,7 @@ ext4_mb_mark_diskspace_used(struct ext4_allocation_context *ac,
|
||||
block = ext4_grp_offs_to_block(sb, &ac->ac_b_ex);
|
||||
|
||||
len = EXT4_C2B(sbi, ac->ac_b_ex.fe_len);
|
||||
if (!ext4_data_block_valid(sbi, block, len)) {
|
||||
if (!ext4_inode_block_valid(ac->ac_inode, block, len)) {
|
||||
ext4_error(sb, "Allocating blocks %llu-%llu which overlap "
|
||||
"fs metadata", block, block+len);
|
||||
/* File system mounted not to panic on error
|
||||
@@ -4726,7 +4726,7 @@ void ext4_free_blocks(handle_t *handle, struct inode *inode,
|
||||
|
||||
sbi = EXT4_SB(sb);
|
||||
if (!(flags & EXT4_FREE_BLOCKS_VALIDATED) &&
|
||||
!ext4_data_block_valid(sbi, block, count)) {
|
||||
!ext4_inode_block_valid(inode, block, count)) {
|
||||
ext4_error(sb, "Freeing blocks not in datazone - "
|
||||
"block = %llu, count = %lu", block, count);
|
||||
goto error_return;
|
||||
|
||||
@@ -3373,6 +3373,31 @@ static int ext4_setent(handle_t *handle, struct ext4_renament *ent,
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void ext4_resetent(handle_t *handle, struct ext4_renament *ent,
|
||||
unsigned ino, unsigned file_type)
|
||||
{
|
||||
struct ext4_renament old = *ent;
|
||||
int retval = 0;
|
||||
|
||||
/*
|
||||
* old->de could have moved from under us during make indexed dir,
|
||||
* so the old->de may no longer valid and need to find it again
|
||||
* before reset old inode info.
|
||||
*/
|
||||
old.bh = ext4_find_entry(old.dir, &old.dentry->d_name, &old.de, NULL);
|
||||
if (IS_ERR(old.bh))
|
||||
retval = PTR_ERR(old.bh);
|
||||
if (!old.bh)
|
||||
retval = -ENOENT;
|
||||
if (retval) {
|
||||
ext4_std_error(old.dir->i_sb, retval);
|
||||
return;
|
||||
}
|
||||
|
||||
ext4_setent(handle, &old, ino, file_type);
|
||||
brelse(old.bh);
|
||||
}
|
||||
|
||||
static int ext4_find_delete_entry(handle_t *handle, struct inode *dir,
|
||||
const struct qstr *d_name)
|
||||
{
|
||||
@@ -3682,8 +3707,8 @@ static int ext4_rename(struct inode *old_dir, struct dentry *old_dentry,
|
||||
end_rename:
|
||||
if (whiteout) {
|
||||
if (retval) {
|
||||
ext4_setent(handle, &old,
|
||||
old.inode->i_ino, old_file_type);
|
||||
ext4_resetent(handle, &old,
|
||||
old.inode->i_ino, old_file_type);
|
||||
drop_nlink(whiteout);
|
||||
}
|
||||
unlock_new_inode(whiteout);
|
||||
|
||||
@@ -5155,7 +5155,10 @@ static int ext4_remount(struct super_block *sb, int *flags, char *data)
|
||||
ext4_register_li_request(sb, first_not_zeroed);
|
||||
}
|
||||
|
||||
ext4_setup_system_zone(sb);
|
||||
err = ext4_setup_system_zone(sb);
|
||||
if (err)
|
||||
goto restore_opts;
|
||||
|
||||
if (sbi->s_journal == NULL && !(old_sb_flags & MS_RDONLY))
|
||||
ext4_commit_super(sb, 1);
|
||||
|
||||
|
||||
10
fs/select.c
10
fs/select.c
@@ -961,10 +961,9 @@ static long do_restart_poll(struct restart_block *restart_block)
|
||||
|
||||
ret = do_sys_poll(ufds, nfds, to);
|
||||
|
||||
if (ret == -EINTR) {
|
||||
restart_block->fn = do_restart_poll;
|
||||
ret = -ERESTART_RESTARTBLOCK;
|
||||
}
|
||||
if (ret == -EINTR)
|
||||
ret = set_restart_fn(restart_block, do_restart_poll);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
@@ -986,7 +985,6 @@ SYSCALL_DEFINE3(poll, struct pollfd __user *, ufds, unsigned int, nfds,
|
||||
struct restart_block *restart_block;
|
||||
|
||||
restart_block = ¤t->restart_block;
|
||||
restart_block->fn = do_restart_poll;
|
||||
restart_block->poll.ufds = ufds;
|
||||
restart_block->poll.nfds = nfds;
|
||||
|
||||
@@ -997,7 +995,7 @@ SYSCALL_DEFINE3(poll, struct pollfd __user *, ufds, unsigned int, nfds,
|
||||
} else
|
||||
restart_block->poll.has_timeout = 0;
|
||||
|
||||
ret = -ERESTART_RESTARTBLOCK;
|
||||
ret = set_restart_fn(restart_block, do_restart_poll);
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
@@ -10,6 +10,10 @@
|
||||
#include <linux/types.h>
|
||||
#include <linux/bug.h>
|
||||
#include <linux/restart_block.h>
|
||||
#include <linux/errno.h>
|
||||
|
||||
struct timespec;
|
||||
struct compat_timespec;
|
||||
|
||||
#ifdef CONFIG_THREAD_INFO_IN_TASK
|
||||
/*
|
||||
@@ -26,6 +30,18 @@
|
||||
|
||||
#ifdef __KERNEL__
|
||||
|
||||
#ifndef arch_set_restart_data
|
||||
#define arch_set_restart_data(restart) do { } while (0)
|
||||
#endif
|
||||
|
||||
static inline long set_restart_fn(struct restart_block *restart,
|
||||
long (*fn)(struct restart_block *))
|
||||
{
|
||||
restart->fn = fn;
|
||||
arch_set_restart_data(restart);
|
||||
return -ERESTART_RESTARTBLOCK;
|
||||
}
|
||||
|
||||
#define THREADINFO_GFP (GFP_KERNEL_ACCOUNT | __GFP_NOTRACK | __GFP_ZERO)
|
||||
|
||||
/*
|
||||
|
||||
@@ -358,6 +358,9 @@ struct usb_config_descriptor {
|
||||
|
||||
/*-------------------------------------------------------------------------*/
|
||||
|
||||
/* USB String descriptors can contain at most 126 characters. */
|
||||
#define USB_MAX_STRING_LEN 126
|
||||
|
||||
/* USB_DT_STRING: String descriptor */
|
||||
struct usb_string_descriptor {
|
||||
__u8 bLength;
|
||||
|
||||
@@ -2822,14 +2822,13 @@ retry:
|
||||
goto out;
|
||||
|
||||
restart = ¤t->restart_block;
|
||||
restart->fn = futex_wait_restart;
|
||||
restart->futex.uaddr = uaddr;
|
||||
restart->futex.val = val;
|
||||
restart->futex.time = abs_time->tv64;
|
||||
restart->futex.bitset = bitset;
|
||||
restart->futex.flags = flags | FLAGS_HAS_TIMEOUT;
|
||||
|
||||
ret = -ERESTART_RESTARTBLOCK;
|
||||
ret = set_restart_fn(restart, futex_wait_restart);
|
||||
|
||||
out:
|
||||
if (to) {
|
||||
|
||||
@@ -886,11 +886,15 @@ irq_forced_thread_fn(struct irq_desc *desc, struct irqaction *action)
|
||||
irqreturn_t ret;
|
||||
|
||||
local_bh_disable();
|
||||
if (!IS_ENABLED(CONFIG_PREEMPT_RT_BASE))
|
||||
local_irq_disable();
|
||||
ret = action->thread_fn(action->irq, action->dev_id);
|
||||
if (ret == IRQ_HANDLED)
|
||||
atomic_inc(&desc->threads_handled);
|
||||
|
||||
irq_finalize_oneshot(desc, action);
|
||||
if (!IS_ENABLED(CONFIG_PREEMPT_RT_BASE))
|
||||
local_irq_enable();
|
||||
local_bh_enable();
|
||||
return ret;
|
||||
}
|
||||
|
||||
@@ -809,10 +809,10 @@ static int alarm_timer_nsleep(const clockid_t which_clock, int flags,
|
||||
}
|
||||
|
||||
restart = ¤t->restart_block;
|
||||
restart->fn = alarm_timer_nsleep_restart;
|
||||
restart->nanosleep.clockid = type;
|
||||
restart->nanosleep.expires = exp.tv64;
|
||||
restart->nanosleep.rmtp = rmtp;
|
||||
set_restart_fn(restart, alarm_timer_nsleep_restart);
|
||||
ret = -ERESTART_RESTARTBLOCK;
|
||||
|
||||
out:
|
||||
|
||||
@@ -1582,10 +1582,10 @@ long hrtimer_nanosleep(struct timespec *rqtp, struct timespec __user *rmtp,
|
||||
}
|
||||
|
||||
restart = ¤t->restart_block;
|
||||
restart->fn = hrtimer_nanosleep_restart;
|
||||
restart->nanosleep.clockid = t.timer.base->clockid;
|
||||
restart->nanosleep.rmtp = rmtp;
|
||||
restart->nanosleep.expires = hrtimer_get_expires_tv64(&t.timer);
|
||||
set_restart_fn(restart, hrtimer_nanosleep_restart);
|
||||
|
||||
ret = -ERESTART_RESTARTBLOCK;
|
||||
out:
|
||||
|
||||
@@ -1381,10 +1381,10 @@ static int posix_cpu_nsleep(const clockid_t which_clock, int flags,
|
||||
if (rmtp && copy_to_user(rmtp, &it.it_value, sizeof *rmtp))
|
||||
return -EFAULT;
|
||||
|
||||
restart_block->fn = posix_cpu_nsleep_restart;
|
||||
restart_block->nanosleep.clockid = which_clock;
|
||||
restart_block->nanosleep.rmtp = rmtp;
|
||||
restart_block->nanosleep.expires = timespec_to_ns(rqtp);
|
||||
set_restart_fn(restart_block, posix_cpu_nsleep_restart);
|
||||
}
|
||||
return error;
|
||||
}
|
||||
|
||||
@@ -232,7 +232,7 @@ int qrtr_endpoint_post(struct qrtr_endpoint *ep, const void *data, size_t len)
|
||||
if (dst != QRTR_PORT_CTRL && type != QRTR_TYPE_DATA)
|
||||
return -EINVAL;
|
||||
|
||||
skb = netdev_alloc_skb(NULL, len);
|
||||
skb = __netdev_alloc_skb(NULL, len, GFP_ATOMIC | __GFP_NOWARN);
|
||||
if (!skb)
|
||||
return -ENOMEM;
|
||||
|
||||
|
||||
@@ -1306,7 +1306,7 @@ svc_process_common(struct svc_rqst *rqstp, struct kvec *argv, struct kvec *resv)
|
||||
|
||||
sendit:
|
||||
if (svc_authorise(rqstp))
|
||||
goto close;
|
||||
goto close_xprt;
|
||||
return 1; /* Caller can now send it */
|
||||
|
||||
dropit:
|
||||
@@ -1315,6 +1315,8 @@ svc_process_common(struct svc_rqst *rqstp, struct kvec *argv, struct kvec *resv)
|
||||
return 0;
|
||||
|
||||
close:
|
||||
svc_authorise(rqstp);
|
||||
close_xprt:
|
||||
if (rqstp->rq_xprt && test_bit(XPT_TEMP, &rqstp->rq_xprt->xpt_flags))
|
||||
svc_close_xprt(rqstp->rq_xprt);
|
||||
dprintk("svc: svc_process close\n");
|
||||
@@ -1323,7 +1325,7 @@ svc_process_common(struct svc_rqst *rqstp, struct kvec *argv, struct kvec *resv)
|
||||
err_short_len:
|
||||
svc_printk(rqstp, "short len %Zd, dropping request\n",
|
||||
argv->iov_len);
|
||||
goto close;
|
||||
goto close_xprt;
|
||||
|
||||
err_bad_rpc:
|
||||
serv->sv_stats->rpcbadfmt++;
|
||||
|
||||
@@ -1104,7 +1104,7 @@ static int svc_close_list(struct svc_serv *serv, struct list_head *xprt_list, st
|
||||
struct svc_xprt *xprt;
|
||||
int ret = 0;
|
||||
|
||||
spin_lock(&serv->sv_lock);
|
||||
spin_lock_bh(&serv->sv_lock);
|
||||
list_for_each_entry(xprt, xprt_list, xpt_list) {
|
||||
if (xprt->xpt_net != net)
|
||||
continue;
|
||||
@@ -1112,7 +1112,7 @@ static int svc_close_list(struct svc_serv *serv, struct list_head *xprt_list, st
|
||||
set_bit(XPT_CLOSE, &xprt->xpt_flags);
|
||||
svc_xprt_enqueue(xprt);
|
||||
}
|
||||
spin_unlock(&serv->sv_lock);
|
||||
spin_unlock_bh(&serv->sv_lock);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
@@ -328,9 +328,9 @@ xprt_setup_rdma_bc(struct xprt_create *args)
|
||||
xprt->timeout = &xprt_rdma_bc_timeout;
|
||||
xprt_set_bound(xprt);
|
||||
xprt_set_connected(xprt);
|
||||
xprt->bind_timeout = RPCRDMA_BIND_TO;
|
||||
xprt->reestablish_timeout = RPCRDMA_INIT_REEST_TO;
|
||||
xprt->idle_timeout = RPCRDMA_IDLE_DISC_TO;
|
||||
xprt->bind_timeout = 0;
|
||||
xprt->reestablish_timeout = 0;
|
||||
xprt->idle_timeout = 0;
|
||||
|
||||
xprt->prot = XPRT_TRANSPORT_BC_RDMA;
|
||||
xprt->tsh_size = RPCRDMA_HDRLEN_MIN / sizeof(__be32);
|
||||
|
||||
Reference in New Issue
Block a user