Merge f976d964a6
("Input: adp5589-keys - fix adp5589_gpio_get_value()") into android12-5.10-lts
Steps on the way to 5.10.227 Resolves merge conflicts in: fs/nfsd/nfs4xdr.c fs/nfsd/vfs.c Change-Id: I8ed4156759977aa5c53d577990f4b72e61530ebf Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>
This commit is contained in:
commit
509ddbb2b8
@ -217,10 +217,10 @@ linux_gateway_entry:
|
||||
|
||||
#ifdef CONFIG_64BIT
|
||||
ldil L%sys_call_table, %r1
|
||||
or,= %r2,%r2,%r2
|
||||
addil L%(sys_call_table64-sys_call_table), %r1
|
||||
or,ev %r2,%r2,%r2
|
||||
ldil L%sys_call_table64, %r1
|
||||
ldo R%sys_call_table(%r1), %r19
|
||||
or,= %r2,%r2,%r2
|
||||
or,ev %r2,%r2,%r2
|
||||
ldo R%sys_call_table64(%r1), %r19
|
||||
#else
|
||||
load32 sys_call_table, %r19
|
||||
@ -355,10 +355,10 @@ tracesys_next:
|
||||
extrd,u %r19,63,1,%r2 /* W hidden in bottom bit */
|
||||
|
||||
ldil L%sys_call_table, %r1
|
||||
or,= %r2,%r2,%r2
|
||||
addil L%(sys_call_table64-sys_call_table), %r1
|
||||
or,ev %r2,%r2,%r2
|
||||
ldil L%sys_call_table64, %r1
|
||||
ldo R%sys_call_table(%r1), %r19
|
||||
or,= %r2,%r2,%r2
|
||||
or,ev %r2,%r2,%r2
|
||||
ldo R%sys_call_table64(%r1), %r19
|
||||
#else
|
||||
load32 sys_call_table, %r19
|
||||
@ -931,6 +931,8 @@ ENTRY(sys_call_table)
|
||||
END(sys_call_table)
|
||||
|
||||
#ifdef CONFIG_64BIT
|
||||
#undef __SYSCALL_WITH_COMPAT
|
||||
#define __SYSCALL_WITH_COMPAT(nr, native, compat) __SYSCALL(nr, native)
|
||||
.align 8
|
||||
ENTRY(sys_call_table64)
|
||||
#include <asm/syscall_table_64.h> /* 64-bit native syscalls */
|
||||
|
@ -193,6 +193,11 @@ config GENERIC_HWEIGHT
|
||||
config FIX_EARLYCON_MEM
|
||||
def_bool MMU
|
||||
|
||||
config ILLEGAL_POINTER_VALUE
|
||||
hex
|
||||
default 0 if 32BIT
|
||||
default 0xdead000000000000 if 64BIT
|
||||
|
||||
config PGTABLE_LEVELS
|
||||
int
|
||||
default 3 if 64BIT
|
||||
|
@ -362,6 +362,7 @@ ata_rw_frameinit(struct frame *f)
|
||||
}
|
||||
|
||||
ah->cmdstat = ATA_CMD_PIO_READ | writebit | extbit;
|
||||
dev_hold(t->ifp->nd);
|
||||
skb->dev = t->ifp->nd;
|
||||
}
|
||||
|
||||
@ -402,6 +403,8 @@ aoecmd_ata_rw(struct aoedev *d)
|
||||
__skb_queue_head_init(&queue);
|
||||
__skb_queue_tail(&queue, skb);
|
||||
aoenet_xmit(&queue);
|
||||
} else {
|
||||
dev_put(f->t->ifp->nd);
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
@ -484,10 +487,13 @@ resend(struct aoedev *d, struct frame *f)
|
||||
memcpy(h->dst, t->addr, sizeof h->dst);
|
||||
memcpy(h->src, t->ifp->nd->dev_addr, sizeof h->src);
|
||||
|
||||
dev_hold(t->ifp->nd);
|
||||
skb->dev = t->ifp->nd;
|
||||
skb = skb_clone(skb, GFP_ATOMIC);
|
||||
if (skb == NULL)
|
||||
if (skb == NULL) {
|
||||
dev_put(t->ifp->nd);
|
||||
return;
|
||||
}
|
||||
f->sent = ktime_get();
|
||||
__skb_queue_head_init(&queue);
|
||||
__skb_queue_tail(&queue, skb);
|
||||
@ -618,6 +624,8 @@ probe(struct aoetgt *t)
|
||||
__skb_queue_head_init(&queue);
|
||||
__skb_queue_tail(&queue, skb);
|
||||
aoenet_xmit(&queue);
|
||||
} else {
|
||||
dev_put(f->t->ifp->nd);
|
||||
}
|
||||
}
|
||||
|
||||
@ -1403,6 +1411,7 @@ aoecmd_ata_id(struct aoedev *d)
|
||||
ah->cmdstat = ATA_CMD_ID_ATA;
|
||||
ah->lba3 = 0xa0;
|
||||
|
||||
dev_hold(t->ifp->nd);
|
||||
skb->dev = t->ifp->nd;
|
||||
|
||||
d->rttavg = RTTAVG_INIT;
|
||||
@ -1412,6 +1421,8 @@ aoecmd_ata_id(struct aoedev *d)
|
||||
skb = skb_clone(skb, GFP_ATOMIC);
|
||||
if (skb)
|
||||
f->sent = ktime_get();
|
||||
else
|
||||
dev_put(t->ifp->nd);
|
||||
|
||||
return skb;
|
||||
}
|
||||
|
@ -270,6 +270,8 @@ static int clk_rpmh_bcm_send_cmd(struct clk_rpmh *c, bool enable)
|
||||
cmd_state = 0;
|
||||
}
|
||||
|
||||
cmd_state = min(cmd_state, BCM_TCS_CMD_VOTE_MASK);
|
||||
|
||||
if (c->last_sent_aggr_state != cmd_state) {
|
||||
cmd.addr = c->res_addr;
|
||||
cmd.data = BCM_TCS_CMD(1, enable, 0, cmd_state);
|
||||
|
@ -3229,7 +3229,7 @@ static struct gdsc pcie_0_gdsc = {
|
||||
.pd = {
|
||||
.name = "pcie_0_gdsc",
|
||||
},
|
||||
.pwrsts = PWRSTS_OFF_ON,
|
||||
.pwrsts = PWRSTS_RET_ON,
|
||||
};
|
||||
|
||||
static struct gdsc pcie_1_gdsc = {
|
||||
@ -3237,7 +3237,7 @@ static struct gdsc pcie_1_gdsc = {
|
||||
.pd = {
|
||||
.name = "pcie_1_gdsc",
|
||||
},
|
||||
.pwrsts = PWRSTS_OFF_ON,
|
||||
.pwrsts = PWRSTS_RET_ON,
|
||||
};
|
||||
|
||||
static struct gdsc pcie_2_gdsc = {
|
||||
@ -3245,7 +3245,7 @@ static struct gdsc pcie_2_gdsc = {
|
||||
.pd = {
|
||||
.name = "pcie_2_gdsc",
|
||||
},
|
||||
.pwrsts = PWRSTS_OFF_ON,
|
||||
.pwrsts = PWRSTS_RET_ON,
|
||||
};
|
||||
|
||||
static struct gdsc ufs_card_gdsc = {
|
||||
|
@ -442,12 +442,13 @@ void rockchip_clk_register_branches(struct rockchip_clk_provider *ctx,
|
||||
struct rockchip_clk_branch *list,
|
||||
unsigned int nr_clk)
|
||||
{
|
||||
struct clk *clk = NULL;
|
||||
struct clk *clk;
|
||||
unsigned int idx;
|
||||
unsigned long flags;
|
||||
|
||||
for (idx = 0; idx < nr_clk; idx++, list++) {
|
||||
flags = list->flags;
|
||||
clk = NULL;
|
||||
|
||||
/* catch simple muxes */
|
||||
switch (list->branch_type) {
|
||||
|
@ -600,6 +600,10 @@ static int omapdrm_init(struct omap_drm_private *priv, struct device *dev)
|
||||
soc = soc_device_match(omapdrm_soc_devices);
|
||||
priv->omaprev = soc ? (unsigned int)soc->data : 0;
|
||||
priv->wq = alloc_ordered_workqueue("omapdrm", 0);
|
||||
if (!priv->wq) {
|
||||
ret = -ENOMEM;
|
||||
goto err_alloc_workqueue;
|
||||
}
|
||||
|
||||
mutex_init(&priv->list_lock);
|
||||
INIT_LIST_HEAD(&priv->obj_list);
|
||||
@ -649,6 +653,7 @@ static int omapdrm_init(struct omap_drm_private *priv, struct device *dev)
|
||||
err_gem_deinit:
|
||||
omap_gem_deinit(ddev);
|
||||
destroy_workqueue(priv->wq);
|
||||
err_alloc_workqueue:
|
||||
omap_disconnect_pipelines(ddev);
|
||||
omap_crtc_pre_uninit(priv);
|
||||
drm_dev_put(ddev);
|
||||
|
@ -661,22 +661,8 @@ static int ak8975_start_read_axis(struct ak8975_data *data,
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
/* This will be executed only for non-interrupt based waiting case */
|
||||
if (ret & data->def->ctrl_masks[ST1_DRDY]) {
|
||||
ret = i2c_smbus_read_byte_data(client,
|
||||
data->def->ctrl_regs[ST2]);
|
||||
if (ret < 0) {
|
||||
dev_err(&client->dev, "Error in reading ST2\n");
|
||||
return ret;
|
||||
}
|
||||
if (ret & (data->def->ctrl_masks[ST2_DERR] |
|
||||
data->def->ctrl_masks[ST2_HOFL])) {
|
||||
dev_err(&client->dev, "ST2 status error 0x%x\n", ret);
|
||||
return -EINVAL;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
/* Return with zero if the data is ready. */
|
||||
return !data->def->ctrl_regs[ST1_DRDY];
|
||||
}
|
||||
|
||||
/* Retrieve raw flux value for one of the x, y, or z axis. */
|
||||
@ -703,6 +689,20 @@ static int ak8975_read_axis(struct iio_dev *indio_dev, int index, int *val)
|
||||
if (ret < 0)
|
||||
goto exit;
|
||||
|
||||
/* Read out ST2 for release lock on measurment data. */
|
||||
ret = i2c_smbus_read_byte_data(client, data->def->ctrl_regs[ST2]);
|
||||
if (ret < 0) {
|
||||
dev_err(&client->dev, "Error in reading ST2\n");
|
||||
goto exit;
|
||||
}
|
||||
|
||||
if (ret & (data->def->ctrl_masks[ST2_DERR] |
|
||||
data->def->ctrl_masks[ST2_HOFL])) {
|
||||
dev_err(&client->dev, "ST2 status error 0x%x\n", ret);
|
||||
ret = -EINVAL;
|
||||
goto exit;
|
||||
}
|
||||
|
||||
mutex_unlock(&data->lock);
|
||||
|
||||
pm_runtime_mark_last_busy(&data->client->dev);
|
||||
|
@ -390,10 +390,17 @@ static int adp5589_gpio_get_value(struct gpio_chip *chip, unsigned off)
|
||||
struct adp5589_kpad *kpad = gpiochip_get_data(chip);
|
||||
unsigned int bank = kpad->var->bank(kpad->gpiomap[off]);
|
||||
unsigned int bit = kpad->var->bit(kpad->gpiomap[off]);
|
||||
int val;
|
||||
|
||||
return !!(adp5589_read(kpad->client,
|
||||
kpad->var->reg(ADP5589_GPI_STATUS_A) + bank) &
|
||||
bit);
|
||||
mutex_lock(&kpad->gpio_lock);
|
||||
if (kpad->dir[bank] & bit)
|
||||
val = kpad->dat_out[bank];
|
||||
else
|
||||
val = adp5589_read(kpad->client,
|
||||
kpad->var->reg(ADP5589_GPI_STATUS_A) + bank);
|
||||
mutex_unlock(&kpad->gpio_lock);
|
||||
|
||||
return !!(val & bit);
|
||||
}
|
||||
|
||||
static void adp5589_gpio_set_value(struct gpio_chip *chip,
|
||||
|
@ -366,6 +366,7 @@ static int venus_remove(struct platform_device *pdev)
|
||||
struct device *dev = core->dev;
|
||||
int ret;
|
||||
|
||||
cancel_delayed_work_sync(&core->work);
|
||||
ret = pm_runtime_get_sync(dev);
|
||||
WARN_ON(ret < 0);
|
||||
|
||||
|
@ -40,6 +40,10 @@ static const struct media_entity_operations sun4i_csi_video_entity_ops = {
|
||||
.link_validate = v4l2_subdev_link_validate,
|
||||
};
|
||||
|
||||
static const struct media_entity_operations sun4i_csi_subdev_entity_ops = {
|
||||
.link_validate = v4l2_subdev_link_validate,
|
||||
};
|
||||
|
||||
static int sun4i_csi_notify_bound(struct v4l2_async_notifier *notifier,
|
||||
struct v4l2_subdev *subdev,
|
||||
struct v4l2_async_subdev *asd)
|
||||
@ -245,6 +249,7 @@ static int sun4i_csi_probe(struct platform_device *pdev)
|
||||
v4l2_subdev_init(subdev, &sun4i_csi_subdev_ops);
|
||||
subdev->flags = V4L2_SUBDEV_FL_HAS_DEVNODE | V4L2_SUBDEV_FL_HAS_EVENTS;
|
||||
subdev->entity.function = MEDIA_ENT_F_VID_IF_BRIDGE;
|
||||
subdev->entity.ops = &sun4i_csi_subdev_entity_ops;
|
||||
subdev->owner = THIS_MODULE;
|
||||
snprintf(subdev->name, sizeof(subdev->name), "sun4i-csi-0");
|
||||
v4l2_set_subdevdata(subdev, csi);
|
||||
|
@ -363,6 +363,7 @@ static int tc_setup_cbs(struct stmmac_priv *priv,
|
||||
return ret;
|
||||
|
||||
priv->plat->tx_queues_cfg[queue].mode_to_use = MTL_QUEUE_DCB;
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Final adjustments for HW */
|
||||
|
@ -642,8 +642,7 @@ struct irq_domain *of_msi_map_get_device_domain(struct device *dev, u32 id,
|
||||
* @np: device node for @dev
|
||||
* @token: bus type for this domain
|
||||
*
|
||||
* Parse the msi-parent property (both the simple and the complex
|
||||
* versions), and returns the corresponding MSI domain.
|
||||
* Parse the msi-parent property and returns the corresponding MSI domain.
|
||||
*
|
||||
* Returns: the MSI domain for this device (or NULL on failure).
|
||||
*/
|
||||
@ -651,33 +650,14 @@ struct irq_domain *of_msi_get_domain(struct device *dev,
|
||||
struct device_node *np,
|
||||
enum irq_domain_bus_token token)
|
||||
{
|
||||
struct device_node *msi_np;
|
||||
struct of_phandle_iterator it;
|
||||
struct irq_domain *d;
|
||||
int err;
|
||||
|
||||
/* Check for a single msi-parent property */
|
||||
msi_np = of_parse_phandle(np, "msi-parent", 0);
|
||||
if (msi_np && !of_property_read_bool(msi_np, "#msi-cells")) {
|
||||
d = irq_find_matching_host(msi_np, token);
|
||||
if (!d)
|
||||
of_node_put(msi_np);
|
||||
return d;
|
||||
}
|
||||
|
||||
if (token == DOMAIN_BUS_PLATFORM_MSI) {
|
||||
/* Check for the complex msi-parent version */
|
||||
struct of_phandle_args args;
|
||||
int index = 0;
|
||||
|
||||
while (!of_parse_phandle_with_args(np, "msi-parent",
|
||||
"#msi-cells",
|
||||
index, &args)) {
|
||||
d = irq_find_matching_host(args.np, token);
|
||||
if (d)
|
||||
return d;
|
||||
|
||||
of_node_put(args.np);
|
||||
index++;
|
||||
}
|
||||
of_for_each_phandle(&it, err, np, "msi-parent", "#msi-cells", 0) {
|
||||
d = irq_find_matching_host(it.node, token);
|
||||
if (d)
|
||||
return d;
|
||||
}
|
||||
|
||||
return NULL;
|
||||
|
@ -368,6 +368,7 @@ static int at91_rtc_probe(struct platform_device *pdev)
|
||||
return ret;
|
||||
|
||||
rtc->gpbr = syscon_node_to_regmap(args.np);
|
||||
of_node_put(args.np);
|
||||
rtc->gpbr_offset = args.args[0];
|
||||
if (IS_ERR(rtc->gpbr)) {
|
||||
dev_err(&pdev->dev, "failed to retrieve gpbr regmap, aborting.\n");
|
||||
|
@ -768,7 +768,8 @@ int setup_arg_pages(struct linux_binprm *bprm,
|
||||
stack_base = STACK_SIZE_MAX;
|
||||
|
||||
/* Add space for stack randomization. */
|
||||
stack_base += (STACK_RND_MASK << PAGE_SHIFT);
|
||||
if (current->flags & PF_RANDOMIZE)
|
||||
stack_base += (STACK_RND_MASK << PAGE_SHIFT);
|
||||
|
||||
/* Make sure we didn't let the argument array grow too large. */
|
||||
if (vma->vm_end - vma->vm_start > stack_base)
|
||||
|
@ -110,11 +110,8 @@ int exfat_load_bitmap(struct super_block *sb)
|
||||
return -EIO;
|
||||
|
||||
type = exfat_get_entry_type(ep);
|
||||
if (type == TYPE_UNUSED)
|
||||
break;
|
||||
if (type != TYPE_BITMAP)
|
||||
continue;
|
||||
if (ep->dentry.bitmap.flags == 0x0) {
|
||||
if (type == TYPE_BITMAP &&
|
||||
ep->dentry.bitmap.flags == 0x0) {
|
||||
int err;
|
||||
|
||||
err = exfat_allocate_bitmap(sb, ep);
|
||||
@ -122,6 +119,9 @@ int exfat_load_bitmap(struct super_block *sb)
|
||||
return err;
|
||||
}
|
||||
brelse(bh);
|
||||
|
||||
if (type == TYPE_UNUSED)
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
if (exfat_get_next_cluster(sb, &clu.dir))
|
||||
|
@ -949,6 +949,8 @@ ext4_find_extent(struct inode *inode, ext4_lblk_t block,
|
||||
|
||||
ext4_ext_show_path(inode, path);
|
||||
|
||||
if (orig_path)
|
||||
*orig_path = path;
|
||||
return path;
|
||||
|
||||
err:
|
||||
@ -1867,6 +1869,7 @@ static void ext4_ext_try_to_merge_up(handle_t *handle,
|
||||
path[0].p_hdr->eh_max = cpu_to_le16(max_root);
|
||||
|
||||
brelse(path[1].p_bh);
|
||||
path[1].p_bh = NULL;
|
||||
ext4_free_blocks(handle, inode, NULL, blk, 1,
|
||||
EXT4_FREE_BLOCKS_METADATA | EXT4_FREE_BLOCKS_FORGET);
|
||||
}
|
||||
@ -2095,6 +2098,7 @@ int ext4_ext_insert_extent(handle_t *handle, struct inode *inode,
|
||||
ppath, newext);
|
||||
if (err)
|
||||
goto cleanup;
|
||||
path = *ppath;
|
||||
depth = ext_depth(inode);
|
||||
eh = path[depth].p_hdr;
|
||||
|
||||
@ -3226,6 +3230,24 @@ static int ext4_split_extent_at(handle_t *handle,
|
||||
if (err != -ENOSPC && err != -EDQUOT)
|
||||
goto out;
|
||||
|
||||
/*
|
||||
* Update path is required because previous ext4_ext_insert_extent()
|
||||
* may have freed or reallocated the path. Using EXT4_EX_NOFAIL
|
||||
* guarantees that ext4_find_extent() will not return -ENOMEM,
|
||||
* otherwise -ENOMEM will cause a retry in do_writepages(), and a
|
||||
* WARN_ON may be triggered in ext4_da_update_reserve_space() due to
|
||||
* an incorrect ee_len causing the i_reserved_data_blocks exception.
|
||||
*/
|
||||
path = ext4_find_extent(inode, ee_block, ppath,
|
||||
flags | EXT4_EX_NOFAIL);
|
||||
if (IS_ERR(path)) {
|
||||
EXT4_ERROR_INODE(inode, "Failed split extent on %u, err %ld",
|
||||
split, PTR_ERR(path));
|
||||
return PTR_ERR(path);
|
||||
}
|
||||
depth = ext_depth(inode);
|
||||
ex = path[depth].p_ext;
|
||||
|
||||
if (EXT4_EXT_MAY_ZEROOUT & split_flag) {
|
||||
if (split_flag & (EXT4_EXT_DATA_VALID1|EXT4_EXT_DATA_VALID2)) {
|
||||
if (split_flag & EXT4_EXT_DATA_VALID1) {
|
||||
@ -3278,7 +3300,7 @@ static int ext4_split_extent_at(handle_t *handle,
|
||||
ext4_ext_dirty(handle, inode, path + path->p_depth);
|
||||
return err;
|
||||
out:
|
||||
ext4_ext_show_leaf(inode, path);
|
||||
ext4_ext_show_leaf(inode, *ppath);
|
||||
return err;
|
||||
}
|
||||
|
||||
@ -5547,6 +5569,7 @@ static int ext4_insert_range(struct file *file, loff_t offset, loff_t len)
|
||||
path = ext4_find_extent(inode, offset_lblk, NULL, 0);
|
||||
if (IS_ERR(path)) {
|
||||
up_write(&EXT4_I(inode)->i_data_sem);
|
||||
ret = PTR_ERR(path);
|
||||
goto out_stop;
|
||||
}
|
||||
|
||||
@ -5908,7 +5931,7 @@ int ext4_clu_mapped(struct inode *inode, ext4_lblk_t lclu)
|
||||
int ext4_ext_replay_update_ex(struct inode *inode, ext4_lblk_t start,
|
||||
int len, int unwritten, ext4_fsblk_t pblk)
|
||||
{
|
||||
struct ext4_ext_path *path = NULL, *ppath;
|
||||
struct ext4_ext_path *path;
|
||||
struct ext4_extent *ex;
|
||||
int ret;
|
||||
|
||||
@ -5924,30 +5947,29 @@ int ext4_ext_replay_update_ex(struct inode *inode, ext4_lblk_t start,
|
||||
if (le32_to_cpu(ex->ee_block) != start ||
|
||||
ext4_ext_get_actual_len(ex) != len) {
|
||||
/* We need to split this extent to match our extent first */
|
||||
ppath = path;
|
||||
down_write(&EXT4_I(inode)->i_data_sem);
|
||||
ret = ext4_force_split_extent_at(NULL, inode, &ppath, start, 1);
|
||||
ret = ext4_force_split_extent_at(NULL, inode, &path, start, 1);
|
||||
up_write(&EXT4_I(inode)->i_data_sem);
|
||||
if (ret)
|
||||
goto out;
|
||||
kfree(path);
|
||||
path = ext4_find_extent(inode, start, NULL, 0);
|
||||
|
||||
path = ext4_find_extent(inode, start, &path, 0);
|
||||
if (IS_ERR(path))
|
||||
return -1;
|
||||
ppath = path;
|
||||
return PTR_ERR(path);
|
||||
ex = path[path->p_depth].p_ext;
|
||||
WARN_ON(le32_to_cpu(ex->ee_block) != start);
|
||||
|
||||
if (ext4_ext_get_actual_len(ex) != len) {
|
||||
down_write(&EXT4_I(inode)->i_data_sem);
|
||||
ret = ext4_force_split_extent_at(NULL, inode, &ppath,
|
||||
ret = ext4_force_split_extent_at(NULL, inode, &path,
|
||||
start + len, 1);
|
||||
up_write(&EXT4_I(inode)->i_data_sem);
|
||||
if (ret)
|
||||
goto out;
|
||||
kfree(path);
|
||||
path = ext4_find_extent(inode, start, NULL, 0);
|
||||
|
||||
path = ext4_find_extent(inode, start, &path, 0);
|
||||
if (IS_ERR(path))
|
||||
return -EINVAL;
|
||||
return PTR_ERR(path);
|
||||
ex = path[path->p_depth].p_ext;
|
||||
}
|
||||
}
|
||||
|
@ -5399,8 +5399,9 @@ static void ext4_wait_for_tail_page_commit(struct inode *inode)
|
||||
struct page *page;
|
||||
unsigned offset;
|
||||
journal_t *journal = EXT4_SB(inode->i_sb)->s_journal;
|
||||
tid_t commit_tid = 0;
|
||||
tid_t commit_tid;
|
||||
int ret;
|
||||
bool has_transaction;
|
||||
|
||||
offset = inode->i_size & (PAGE_SIZE - 1);
|
||||
/*
|
||||
@ -5425,12 +5426,14 @@ static void ext4_wait_for_tail_page_commit(struct inode *inode)
|
||||
put_page(page);
|
||||
if (ret != -EBUSY)
|
||||
return;
|
||||
commit_tid = 0;
|
||||
has_transaction = false;
|
||||
read_lock(&journal->j_state_lock);
|
||||
if (journal->j_committing_transaction)
|
||||
if (journal->j_committing_transaction) {
|
||||
commit_tid = journal->j_committing_transaction->t_tid;
|
||||
has_transaction = true;
|
||||
}
|
||||
read_unlock(&journal->j_state_lock);
|
||||
if (commit_tid)
|
||||
if (has_transaction)
|
||||
jbd2_log_wait_commit(journal, commit_tid);
|
||||
}
|
||||
}
|
||||
|
@ -36,7 +36,6 @@ get_ext_path(struct inode *inode, ext4_lblk_t lblock,
|
||||
*ppath = NULL;
|
||||
return -ENODATA;
|
||||
}
|
||||
*ppath = path;
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -2006,7 +2006,7 @@ static struct ext4_dir_entry_2 *do_split(handle_t *handle, struct inode *dir,
|
||||
split = count/2;
|
||||
|
||||
hash2 = map[split].hash;
|
||||
continued = hash2 == map[split - 1].hash;
|
||||
continued = split > 0 ? hash2 == map[split - 1].hash : 0;
|
||||
dxtrace(printk(KERN_INFO "Split block %lu at %x, %i/%i\n",
|
||||
(unsigned long)dx_get_block(frame->at),
|
||||
hash2, split, count-split));
|
||||
|
@ -115,17 +115,23 @@ __releases(&journal->j_state_lock)
|
||||
if (space_left < nblocks) {
|
||||
int chkpt = journal->j_checkpoint_transactions != NULL;
|
||||
tid_t tid = 0;
|
||||
bool has_transaction = false;
|
||||
|
||||
if (journal->j_committing_transaction)
|
||||
if (journal->j_committing_transaction) {
|
||||
tid = journal->j_committing_transaction->t_tid;
|
||||
has_transaction = true;
|
||||
}
|
||||
spin_unlock(&journal->j_list_lock);
|
||||
write_unlock(&journal->j_state_lock);
|
||||
if (chkpt) {
|
||||
jbd2_log_do_checkpoint(journal);
|
||||
} else if (jbd2_cleanup_journal_tail(journal) == 0) {
|
||||
/* We were able to recover space; yay! */
|
||||
} else if (jbd2_cleanup_journal_tail(journal) <= 0) {
|
||||
/*
|
||||
* We were able to recover space or the
|
||||
* journal was aborted due to an error.
|
||||
*/
|
||||
;
|
||||
} else if (tid) {
|
||||
} else if (has_transaction) {
|
||||
/*
|
||||
* jbd2_journal_commit_transaction() may want
|
||||
* to take the checkpoint_mutex if JBD2_FLUSHED
|
||||
|
@ -740,7 +740,7 @@ int jbd2_fc_begin_commit(journal_t *journal, tid_t tid)
|
||||
return -EINVAL;
|
||||
|
||||
write_lock(&journal->j_state_lock);
|
||||
if (tid <= journal->j_commit_sequence) {
|
||||
if (tid_geq(journal->j_commit_sequence, tid)) {
|
||||
write_unlock(&journal->j_state_lock);
|
||||
return -EALREADY;
|
||||
}
|
||||
|
@ -868,7 +868,8 @@ static void nfs4_free_deleg(struct nfs4_stid *stid)
|
||||
* When a delegation is recalled, the filehandle is stored in the "new"
|
||||
* filter.
|
||||
* Every 30 seconds we swap the filters and clear the "new" one,
|
||||
* unless both are empty of course.
|
||||
* unless both are empty of course. This results in delegations for a
|
||||
* given filehandle being blocked for between 30 and 60 seconds.
|
||||
*
|
||||
* Each filter is 256 bits. We hash the filehandle to 32bit and use the
|
||||
* low 3 bytes as hash-table indices.
|
||||
@ -897,9 +898,9 @@ static int delegation_blocked(struct knfsd_fh *fh)
|
||||
if (ktime_get_seconds() - bd->swap_time > 30) {
|
||||
bd->entries -= bd->old_entries;
|
||||
bd->old_entries = bd->entries;
|
||||
bd->new = 1-bd->new;
|
||||
memset(bd->set[bd->new], 0,
|
||||
sizeof(bd->set[0]));
|
||||
bd->new = 1-bd->new;
|
||||
bd->swap_time = ktime_get_seconds();
|
||||
}
|
||||
spin_unlock(&blocked_delegations_lock);
|
||||
|
@ -158,9 +158,8 @@ int ocfs2_get_block(struct inode *inode, sector_t iblock,
|
||||
err = ocfs2_extent_map_get_blocks(inode, iblock, &p_blkno, &count,
|
||||
&ext_flags);
|
||||
if (err) {
|
||||
mlog(ML_ERROR, "Error %d from get_blocks(0x%p, %llu, 1, "
|
||||
"%llu, NULL)\n", err, inode, (unsigned long long)iblock,
|
||||
(unsigned long long)p_blkno);
|
||||
mlog(ML_ERROR, "get_blocks() failed, inode: 0x%p, "
|
||||
"block: %llu\n", inode, (unsigned long long)iblock);
|
||||
goto bail;
|
||||
}
|
||||
|
||||
|
@ -237,7 +237,6 @@ int ocfs2_read_blocks(struct ocfs2_caching_info *ci, u64 block, int nr,
|
||||
if (bhs[i] == NULL) {
|
||||
bhs[i] = sb_getblk(sb, block++);
|
||||
if (bhs[i] == NULL) {
|
||||
ocfs2_metadata_cache_io_unlock(ci);
|
||||
status = -ENOMEM;
|
||||
mlog_errno(status);
|
||||
/* Don't forget to put previous bh! */
|
||||
@ -391,7 +390,8 @@ int ocfs2_read_blocks(struct ocfs2_caching_info *ci, u64 block, int nr,
|
||||
/* Always set the buffer in the cache, even if it was
|
||||
* a forced read, or read-ahead which hasn't yet
|
||||
* completed. */
|
||||
ocfs2_set_buffer_uptodate(ci, bh);
|
||||
if (bh)
|
||||
ocfs2_set_buffer_uptodate(ci, bh);
|
||||
}
|
||||
ocfs2_metadata_cache_io_unlock(ci);
|
||||
|
||||
|
@ -996,7 +996,7 @@ void ocfs2_journal_shutdown(struct ocfs2_super *osb)
|
||||
if (!igrab(inode))
|
||||
BUG();
|
||||
|
||||
num_running_trans = atomic_read(&(osb->journal->j_num_trans));
|
||||
num_running_trans = atomic_read(&(journal->j_num_trans));
|
||||
trace_ocfs2_journal_shutdown(num_running_trans);
|
||||
|
||||
/* Do a commit_cache here. It will flush our journal, *and*
|
||||
@ -1015,9 +1015,10 @@ void ocfs2_journal_shutdown(struct ocfs2_super *osb)
|
||||
osb->commit_task = NULL;
|
||||
}
|
||||
|
||||
BUG_ON(atomic_read(&(osb->journal->j_num_trans)) != 0);
|
||||
BUG_ON(atomic_read(&(journal->j_num_trans)) != 0);
|
||||
|
||||
if (ocfs2_mount_local(osb)) {
|
||||
if (ocfs2_mount_local(osb) &&
|
||||
(journal->j_journal->j_flags & JBD2_LOADED)) {
|
||||
jbd2_journal_lock_updates(journal->j_journal);
|
||||
status = jbd2_journal_flush(journal->j_journal);
|
||||
jbd2_journal_unlock_updates(journal->j_journal);
|
||||
|
@ -1010,6 +1010,25 @@ static int ocfs2_sync_local_to_main(struct ocfs2_super *osb,
|
||||
start = bit_off + 1;
|
||||
}
|
||||
|
||||
/* clear the contiguous bits until the end boundary */
|
||||
if (count) {
|
||||
blkno = la_start_blk +
|
||||
ocfs2_clusters_to_blocks(osb->sb,
|
||||
start - count);
|
||||
|
||||
trace_ocfs2_sync_local_to_main_free(
|
||||
count, start - count,
|
||||
(unsigned long long)la_start_blk,
|
||||
(unsigned long long)blkno);
|
||||
|
||||
status = ocfs2_release_clusters(handle,
|
||||
main_bm_inode,
|
||||
main_bm_bh, blkno,
|
||||
count);
|
||||
if (status < 0)
|
||||
mlog_errno(status);
|
||||
}
|
||||
|
||||
bail:
|
||||
if (status)
|
||||
mlog_errno(status);
|
||||
|
@ -689,7 +689,7 @@ static int ocfs2_local_read_info(struct super_block *sb, int type)
|
||||
int status;
|
||||
struct buffer_head *bh = NULL;
|
||||
struct ocfs2_quota_recovery *rec;
|
||||
int locked = 0;
|
||||
int locked = 0, global_read = 0;
|
||||
|
||||
info->dqi_max_spc_limit = 0x7fffffffffffffffLL;
|
||||
info->dqi_max_ino_limit = 0x7fffffffffffffffLL;
|
||||
@ -697,6 +697,7 @@ static int ocfs2_local_read_info(struct super_block *sb, int type)
|
||||
if (!oinfo) {
|
||||
mlog(ML_ERROR, "failed to allocate memory for ocfs2 quota"
|
||||
" info.");
|
||||
status = -ENOMEM;
|
||||
goto out_err;
|
||||
}
|
||||
info->dqi_priv = oinfo;
|
||||
@ -709,6 +710,7 @@ static int ocfs2_local_read_info(struct super_block *sb, int type)
|
||||
status = ocfs2_global_read_info(sb, type);
|
||||
if (status < 0)
|
||||
goto out_err;
|
||||
global_read = 1;
|
||||
|
||||
status = ocfs2_inode_lock(lqinode, &oinfo->dqi_lqi_bh, 1);
|
||||
if (status < 0) {
|
||||
@ -779,10 +781,12 @@ static int ocfs2_local_read_info(struct super_block *sb, int type)
|
||||
if (locked)
|
||||
ocfs2_inode_unlock(lqinode, 1);
|
||||
ocfs2_release_local_quota_bitmaps(&oinfo->dqi_chunk);
|
||||
if (global_read)
|
||||
cancel_delayed_work_sync(&oinfo->dqi_sync_work);
|
||||
kfree(oinfo);
|
||||
}
|
||||
brelse(bh);
|
||||
return -1;
|
||||
return status;
|
||||
}
|
||||
|
||||
/* Write local info to quota file */
|
||||
|
@ -27,6 +27,7 @@
|
||||
#include "namei.h"
|
||||
#include "ocfs2_trace.h"
|
||||
#include "file.h"
|
||||
#include "symlink.h"
|
||||
|
||||
#include <linux/bio.h>
|
||||
#include <linux/blkdev.h>
|
||||
@ -4184,8 +4185,9 @@ static int __ocfs2_reflink(struct dentry *old_dentry,
|
||||
int ret;
|
||||
struct inode *inode = d_inode(old_dentry);
|
||||
struct buffer_head *new_bh = NULL;
|
||||
struct ocfs2_inode_info *oi = OCFS2_I(inode);
|
||||
|
||||
if (OCFS2_I(inode)->ip_flags & OCFS2_INODE_SYSTEM_FILE) {
|
||||
if (oi->ip_flags & OCFS2_INODE_SYSTEM_FILE) {
|
||||
ret = -EINVAL;
|
||||
mlog_errno(ret);
|
||||
goto out;
|
||||
@ -4211,6 +4213,26 @@ static int __ocfs2_reflink(struct dentry *old_dentry,
|
||||
goto out_unlock;
|
||||
}
|
||||
|
||||
if ((oi->ip_dyn_features & OCFS2_HAS_XATTR_FL) &&
|
||||
(oi->ip_dyn_features & OCFS2_INLINE_XATTR_FL)) {
|
||||
/*
|
||||
* Adjust extent record count to reserve space for extended attribute.
|
||||
* Inline data count had been adjusted in ocfs2_duplicate_inline_data().
|
||||
*/
|
||||
struct ocfs2_inode_info *new_oi = OCFS2_I(new_inode);
|
||||
|
||||
if (!(new_oi->ip_dyn_features & OCFS2_INLINE_DATA_FL) &&
|
||||
!(ocfs2_inode_is_fast_symlink(new_inode))) {
|
||||
struct ocfs2_dinode *new_di = (struct ocfs2_dinode *)new_bh->b_data;
|
||||
struct ocfs2_dinode *old_di = (struct ocfs2_dinode *)old_bh->b_data;
|
||||
struct ocfs2_extent_list *el = &new_di->id2.i_list;
|
||||
int inline_size = le16_to_cpu(old_di->i_xattr_inline_size);
|
||||
|
||||
le16_add_cpu(&el->l_count, -(inline_size /
|
||||
sizeof(struct ocfs2_extent_rec)));
|
||||
}
|
||||
}
|
||||
|
||||
ret = ocfs2_create_reflink_node(inode, old_bh,
|
||||
new_inode, new_bh, preserve);
|
||||
if (ret) {
|
||||
@ -4218,7 +4240,7 @@ static int __ocfs2_reflink(struct dentry *old_dentry,
|
||||
goto inode_unlock;
|
||||
}
|
||||
|
||||
if (OCFS2_I(inode)->ip_dyn_features & OCFS2_HAS_XATTR_FL) {
|
||||
if (oi->ip_dyn_features & OCFS2_HAS_XATTR_FL) {
|
||||
ret = ocfs2_reflink_xattrs(inode, old_bh,
|
||||
new_inode, new_bh,
|
||||
preserve);
|
||||
|
@ -6526,16 +6526,7 @@ static int ocfs2_reflink_xattr_inline(struct ocfs2_xattr_reflink *args)
|
||||
}
|
||||
|
||||
new_oi = OCFS2_I(args->new_inode);
|
||||
/*
|
||||
* Adjust extent record count to reserve space for extended attribute.
|
||||
* Inline data count had been adjusted in ocfs2_duplicate_inline_data().
|
||||
*/
|
||||
if (!(new_oi->ip_dyn_features & OCFS2_INLINE_DATA_FL) &&
|
||||
!(ocfs2_inode_is_fast_symlink(args->new_inode))) {
|
||||
struct ocfs2_extent_list *el = &new_di->id2.i_list;
|
||||
le16_add_cpu(&el->l_count, -(inline_size /
|
||||
sizeof(struct ocfs2_extent_rec)));
|
||||
}
|
||||
|
||||
spin_lock(&new_oi->ip_lock);
|
||||
new_oi->ip_dyn_features |= OCFS2_HAS_XATTR_FL | OCFS2_INLINE_XATTR_FL;
|
||||
new_di->i_dyn_features = cpu_to_le16(new_oi->ip_dyn_features);
|
||||
|
@ -132,6 +132,8 @@ static inline void cec_msg_init(struct cec_msg *msg,
|
||||
* Set the msg destination to the orig initiator and the msg initiator to the
|
||||
* orig destination. Note that msg and orig may be the same pointer, in which
|
||||
* case the change is done in place.
|
||||
*
|
||||
* It also zeroes the reply, timeout and flags fields.
|
||||
*/
|
||||
static inline void cec_msg_set_reply_to(struct cec_msg *msg,
|
||||
struct cec_msg *orig)
|
||||
@ -139,7 +141,9 @@ static inline void cec_msg_set_reply_to(struct cec_msg *msg,
|
||||
/* The destination becomes the initiator and vice versa */
|
||||
msg->msg[0] = (cec_msg_destination(orig) << 4) |
|
||||
cec_msg_initiator(orig);
|
||||
msg->reply = msg->timeout = 0;
|
||||
msg->reply = 0;
|
||||
msg->timeout = 0;
|
||||
msg->flags = 0;
|
||||
}
|
||||
|
||||
/* cec_msg flags field */
|
||||
|
@ -1101,6 +1101,13 @@ static __always_inline void *__do_krealloc(const void *p, size_t new_size,
|
||||
|
||||
/* If the object still fits, repoison it precisely. */
|
||||
if (ks >= new_size) {
|
||||
/* Zero out spare memory. */
|
||||
if (want_init_on_alloc(flags)) {
|
||||
kasan_disable_current();
|
||||
memset((void *)p + new_size, 0, ks - new_size);
|
||||
kasan_enable_current();
|
||||
}
|
||||
|
||||
p = kasan_krealloc((void *)p, new_size, flags);
|
||||
return (void *)p;
|
||||
}
|
||||
|
@ -725,10 +725,13 @@ int tomoyo_find_next_domain(struct linux_binprm *bprm)
|
||||
ee->r.obj = &ee->obj;
|
||||
ee->obj.path1 = bprm->file->f_path;
|
||||
/* Get symlink's pathname of program. */
|
||||
retval = -ENOENT;
|
||||
exename.name = tomoyo_realpath_nofollow(original_name);
|
||||
if (!exename.name)
|
||||
goto out;
|
||||
if (!exename.name) {
|
||||
/* Fallback to realpath if symlink's pathname does not exist. */
|
||||
exename.name = tomoyo_realpath_from_path(&bprm->file->f_path);
|
||||
if (!exename.name)
|
||||
goto out;
|
||||
}
|
||||
tomoyo_fill_path_info(&exename);
|
||||
retry:
|
||||
/* Check 'aggregator' directive. */
|
||||
|
Loading…
Reference in New Issue
Block a user