Linux 4.9.51
Greg KH
maintainerI'm announcing the release of the 4.9.51 kernel.
All users of the 4.9 kernel series must upgrade.
The updated 4.9.y git tree can be found at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git linux-4.9.y
and can be browsed at the normal kernel.org git web browser:
http://git.kernel.org/?p=linux/kernel/git/stable/linux-stable.git;a=summary
thanks,
greg k-h
------------
Makefile | 2 arch/x86/include/asm/elf.h | 5 arch/x86/kernel/process_64.c | 236 +++++++++++++------------ drivers/md/raid5.c | 2 drivers/net/ethernet/chelsio/cxgb4/t4_hw.c | 6 drivers/net/ethernet/freescale/fman/mac.c | 3 drivers/net/ethernet/freescale/gianfar.c | 2 drivers/net/ethernet/mellanox/mlxsw/spectrum.c | 6 drivers/net/ethernet/qlogic/qlge/qlge_dbg.c | 2 drivers/net/hyperv/netvsc_drv.c | 7 drivers/net/macsec.c | 1 drivers/net/phy/phy.c | 3 drivers/vhost/net.c | 7 fs/f2fs/recovery.c | 4 fs/inode.c | 1 fs/internal.h | 1 fs/iomap.c | 4 fs/xfs/libxfs/xfs_attr_leaf.c | 2 fs/xfs/libxfs/xfs_bmap.c | 60 +++++- fs/xfs/libxfs/xfs_bmap.h | 2 fs/xfs/libxfs/xfs_bmap_btree.c | 1 fs/xfs/libxfs/xfs_btree.c | 33 ++- fs/xfs/libxfs/xfs_btree.h | 3 fs/xfs/libxfs/xfs_da_btree.c | 2 fs/xfs/libxfs/xfs_dir2_block.c | 2 fs/xfs/libxfs/xfs_dir2_leaf.c | 4 fs/xfs/libxfs/xfs_ialloc.c | 59 ++---- fs/xfs/libxfs/xfs_inode_fork.c | 9 fs/xfs/libxfs/xfs_refcount.c | 14 - fs/xfs/libxfs/xfs_refcount.h | 16 + fs/xfs/xfs_aops.c | 79 +++++--- fs/xfs/xfs_bmap_item.c | 17 + fs/xfs/xfs_bmap_util.c | 95 +++++++--- fs/xfs/xfs_buf.c | 62 ++++++ fs/xfs/xfs_buf.h | 1 fs/xfs/xfs_buf_item.c | 156 ++++++++++------ fs/xfs/xfs_buf_item.h | 5 fs/xfs/xfs_file.c | 39 ---- fs/xfs/xfs_icache.c | 15 - fs/xfs/xfs_inode.c | 35 ++- fs/xfs/xfs_inode_item.c | 74 ++++++- fs/xfs/xfs_ioctl.c | 41 ++-- fs/xfs/xfs_iops.c | 2 fs/xfs/xfs_log.c | 44 +++- fs/xfs/xfs_log_recover.c | 182 ++++++++++++------- fs/xfs/xfs_mount.c | 12 - fs/xfs/xfs_qm.c | 31 +++ fs/xfs/xfs_reflink.c | 4 fs/xfs/xfs_super.c | 2 fs/xfs/xfs_trace.h | 20 ++ fs/xfs/xfs_trans.h | 16 + fs/xfs/xfs_trans_ail.c | 72 +++---- fs/xfs/xfs_trans_bmap.c | 11 - fs/xfs/xfs_trans_buf.c | 98 ++++++---- fs/xfs/xfs_trans_priv.h | 46 +++- include/linux/fs.h | 1 include/linux/netdevice.h | 2 include/net/inet_frag.h | 41 ---- include/net/ip6_fib.h | 32 +++ net/bridge/br_device.c | 3 net/core/datagram.c | 2 net/core/dev.c | 3 net/ieee802154/6lowpan/reassembly.c | 11 - net/ipv4/inet_fragment.c | 4 net/ipv4/ip_fragment.c | 12 - net/ipv4/ip_tunnel.c | 4 net/ipv4/tcp.c | 4 net/ipv6/addrconf.c | 2 net/ipv6/ip6_fib.c | 56 ++++- net/ipv6/ip6_gre.c | 4 net/ipv6/netfilter/nf_conntrack_reasm.c | 12 - net/ipv6/output_core.c | 6 net/ipv6/reassembly.c | 12 - net/ipv6/route.c | 17 + net/kcm/kcmsock.c | 4 net/packet/af_packet.c | 12 - net/sctp/sctp_diag.c | 7 net/sctp/socket.c | 3 net/sctp/ulpqueue.c | 3 79 files changed, 1246 insertions(+), 669 deletions(-)
Amir Goldstein (1):
xfs: fix incorrect log_flushed on fsync
Andy Lutomirski (3):
x86/fsgsbase/64: Fully initialize FS and GS state in start_thread_common x86/fsgsbase/64: Report FSBASE and GSBASE correctly in core dumps x86/switch_to/64: Rewrite FS/GS switching yet again to fix AMD CPUs
Arnd Bergmann (1):
qlge: avoid memcpy buffer overflow
Benjamin Poirier (1):
packet: Don't write vnet header beyond end of buffer
Brian Foster (21):
xfs: fix spurious spin_is_locked() assert failures on non-smp kernels
xfs: push buffer of flush locked dquot to avoid quotacheck deadlock
xfs: release bli from transaction properly on fs shutdown
xfs: remove bli from AIL before release on transaction abort
xfs: free uncommitted transactions during log recovery
xfs: free cowblocks and retry on buffered write ENOSPC
xfs: fix quotacheck dquot id overflow infinite loop
xfs: fix recovery failure when log record header wraps log end
xfs: always verify the log tail during recovery
xfs: fix log recovery corruption error due to tail overwrite
xfs: handle -EFSCORRUPTED during head/tail verification
xfs: add log recovery tracepoint for head/tail
xfs: open-code xfs_buf_item_dirty()
xfs: remove unnecessary dirty bli format check for ordered bufs
xfs: ordered buffer log items are never formatted
xfs: refactor buffer logging into buffer dirtying helper
xfs: don't log dirty ranges for ordered buffers
xfs: skip bmbt block ino validation during owner change
xfs: move bmbt owner change to last step of extent swap
xfs: disallow marking previously dirty buffers as ordered
xfs: relog dirty buffers during swapext bmbt owner change
Carlos Maiolino (3):
xfs: Add infrastructure needed for error propagation during buffer IO failure
xfs: Properly retry failed inode items in case of error during buffer writeback
xfs: stop searching for free slots in an inode chunk when there are none
Christoph Hellwig (6):
xfs: fix multi-AG deadlock in xfs_bunmapi
iomap: fix integer truncation issues in the zeroing and dirtying helpers
xfs: remove xfs_trans_ail_delete_bulk
xfs: disable per-inode DAX flag
xfs: don't set v3 xflags for v2 inodes
xfs: open code end_buffer_async_write in xfs_finish_page_writeback
Claudiu Manoil (1):
gianfar: Fix Tx flow control deactivation
Darrick J. Wong (10):
xfs: try to avoid blowing out the transaction reservation when bunmaping a shared extent
xfs: don't allow bmap on rt files
xfs: don't crash on unexpected holes in dir/attr btrees
xfs: check _btree_check_block value
xfs: set firstfsb to NULLFSBLOCK before feeding it to _bmapi_write
xfs: check _alloc_read_agf buffer pointer before using
xfs: clear MS_ACTIVE after finishing log recovery
xfs: don't leak quotacheck dquots when cow recovery
xfs: evict all inodes involved with log redo item
xfs: fix compiler warnings
Eric Dumazet (3):
udp: on peeking bad csum, drop packets even if not at head
kcm: do not attach PF_KCM sockets to avoid deadlock
ipv6: fix typo in fib6_net_exit()
Eric Sandeen (2):
xfs: write unmount record for ro mounts
xfs: toggle readonly state around xfs_log_mount_finish
Florian Fainelli (2):
fsl/man: Inherit parent device and of_node
Revert "net: phy: Correctly process PHY_HALTED in phy_stop_machine()"
Greg Kroah-Hartman (1):
Linux 4.9.51
Haishuang Yan (1):
ip_tunnel: fix setting ttl and tos value in collect_md mode
Ido Schimmel (2):
mlxsw: spectrum: Forbid linking to devices that have uppers
bridge: switchdev: Clear forward mark when transmitting packet
Jaegeuk Kim (2):
f2fs: let fill_super handle roll-forward errors
f2fs: check hot_data for roll-forward recovery
Jan Kara (1):
xfs: Move handling of missing page into one place in xfs_find_get_desired_pgoff()
Jason Wang (1):
vhost_net: correctly check tx avail during rx busy polling
Jesper Dangaard Brouer (2):
Revert "net: use lib/percpu_counter API for fragmentation mem accounting" Revert "net: fix percpu memory leaks"
Lukas Czerner (1):
xfs: Fix per-inode DAX flag inheritance
Marcelo Ricardo Leitner (1):
sctp: fix missing wake ups in some situations
Omar Sandoval (2):
xfs: fix inobt inode allocation search optimization
xfs: check for race with xfs_reclaim_inode() in xfs_ifree_cluster()
Pan Bian (1):
xfs: use kmem_free to free return value of kmem_zalloc
Sabrina Dubroca (2):
macsec: add genl family module alias
ipv6: fix memory leak with multiple tables during netns destruction
Song Liu (1):
md/raid5: release/flush io in raid5_do_work()
Stefano Brivio (3):
ipv6: accept 64k - 1 packet length in ip6_find_1stfragopt()
sctp: Avoid out-of-bounds reads from address storage
cxgb4: Fix stack out-of-bounds read due to wrong size to t4_record_mbox()
Steffen Klassert (1):
ipv6: Fix may be used uninitialized warning in rt6_check
Wei Wang (3):
ipv6: add rcu grace period before freeing fib6_node
ipv6: fix sparse warning on rt6i_node
tcp: initialize rcv_mss to TCP_MIN_MSS instead of 0
Xin Long (1):
ip6_gre: update mtu properly in ip6gre_err
stephen hemminger (1):
netvsc: fix deadlock betwen link status and removal
Greg KH
maintainerMakefile +1 -1
@@ -1,6 +1,6 @@ VERSION = 4 PATCHLEVEL = 9 -SUBLEVEL = 50 +SUBLEVEL = 51 EXTRAVERSION = NAME = Roaring Lionus
arch/x86/include/asm/elf.h +3 -2
@@ -204,6 +204,7 @@ void set_personality_ia32(bool);#define ELF_CORE_COPY_REGS (pr_reg, regs) \ do { \ + unsigned long base; \ unsigned v; \ (pr_reg)[0] = (regs)->r15; \ (pr_reg)[1] = (regs)->r14; \
@@ -226,8 +227,8 @@ do { \ (pr_reg)[18 ] = (regs)->flags; \ (pr_reg)[19 ] = (regs)->sp; \ (pr_reg)[20 ] = (regs)->ss; \ - (pr_reg)[21 ] = current->thread.fsbase; \ - (pr_reg)[22 ] = current->thread.gsbase; \ +rdmsrl (MSR_FS_BASE , base); (pr_reg)[21 ] = base; \ +rdmsrl (MSR_KERNEL_GS_BASE , base); (pr_reg)[22 ] = base; \ asm("movl %%ds,%0" :"=r" (v)); (pr_reg)[23 ] = v; \ asm("movl %%es,%0" :"=r" (v)); (pr_reg)[24 ] = v; \ asm("movl %%fs,%0" :"=r" (v)); (pr_reg)[25 ] = v; \
arch/x86/kernel/process_64.c +131 -105
270 lines not on this page · raw message
drivers/md/raid5.c +2 -0
@@ -5844,6 +5844,8 @@ static void raid5_do_work(struct work_struct *work)spin_unlock_irq (&conf->device_lock); +r5l_flush_stripe_to_raid (conf->log); +async_tx_issue_pending_all ();blk_finish_plug (&plug);
drivers/net/ethernet/chelsio/cxgb4/t4_hw.c +3 -3
@@ -317,12 +317,12 @@ int t4_wr_mbox_meat_timeout(struct adapter *adap, int mbox, const void *cmd,if (v !=MBOX_OWNER_DRV ) { ret = (v ==MBOX_OWNER_FW ) ? -EBUSY : -ETIMEDOUT ; -t4_record_mbox (adap, cmd,MBOX_LEN , access, ret); +t4_record_mbox (adap, cmd, size, access, ret);return ret; }/* Copy in the new mailbox command and send it on its way ... */ -t4_record_mbox (adap, cmd,MBOX_LEN , access,0 ); +t4_record_mbox (adap, cmd, size, access,0 );for (i =0 ; i < size; i +=8 )t4_write_reg64 (adap, data_reg + i,be64_to_cpu (*p++));
@@ -371,7 +371,7 @@ int t4_wr_mbox_meat_timeout(struct adapter *adap, int mbox, const void *cmd, } ret = (pcie_fw &PCIE_FW_ERR_F ) ? -ENXIO : -ETIMEDOUT ; -t4_record_mbox (adap, cmd,MBOX_LEN , access, ret); +t4_record_mbox (adap, cmd, size, access, ret);dev_err (adap->pdev_dev,"command %#x in mailbox %d timed out\n" , *(const u8 *)cmd, mbox);t4_report_fw_error (adap);
drivers/net/ethernet/freescale/fman/mac.c +3 -0
@@ -622,6 +622,9 @@ static struct platform_device *dpaa_eth_add_device(int fman_id, goto no_mem; } + pdev->dev.of_node = node; + pdev->dev.parent = priv->dev; + ret =platform_device_add_data (pdev, &data,sizeof (data));if (ret) goto err;
drivers/net/ethernet/freescale/gianfar.c +1 -1
@@ -3690,7 +3690,7 @@ static noinline void gfar_update_link_state(struct gfar_private *priv)u32 tempval1 =gfar_read (®s->maccfg1);u32 tempval =gfar_read (®s->maccfg2);u32 ecntrl =gfar_read (®s->ecntrl); -u32 tx_flow_oldval = (tempval &MACCFG1_TX_FLOW ); +u32 tx_flow_oldval = (tempval1 &MACCFG1_TX_FLOW );if (phydev->duplex != priv->oldduplex) {if (!(phydev->duplex))
drivers/net/ethernet/mellanox/mlxsw/spectrum.c +6 -0
@@ -4172,6 +4172,8 @@ static int mlxsw_sp_netdevice_port_upper_event(struct net_device *dev,return -EINVAL ;if (!info->linking)break ; +if (netdev_has_any_upper_dev (upper_dev)) +return -EINVAL ;/* HW limitation forbids to put ports to multiple bridges. */ if (netif_is_bridge_master (upper_dev) && !mlxsw_sp_master_bridge_check (mlxsw_sp, upper_dev))
@@ -4185,6 +4187,10 @@ static int mlxsw_sp_netdevice_port_upper_event(struct net_device *dev,if (netif_is_lag_port (dev) &&is_vlan_dev (upper_dev) && !netif_is_lag_master (vlan_dev_real_dev (upper_dev)))return -EINVAL ; +if (!info->linking) +break ; +if (netdev_has_any_upper_dev (upper_dev)) +return -EINVAL ;break ;case NETDEV_CHANGEUPPER : upper_dev = info->upper_dev;
drivers/net/ethernet/qlogic/qlge/qlge_dbg.c +1 -1
@@ -724,7 +724,7 @@ static void ql_build_coredump_seg_header( seg_hdr->cookie =MPI_COREDUMP_COOKIE ; seg_hdr->segNum = seg_number; seg_hdr->segSize = seg_size; -memcpy (seg_hdr->description, desc, (sizeof (seg_hdr->description)) -1 ); +strncpy (seg_hdr->description, desc, (sizeof (seg_hdr->description)) -1 ); }/*
drivers/net/hyperv/netvsc_drv.c +6 -1
@@ -1084,7 +1084,12 @@ static void netvsc_link_change(struct work_struct *w)bool notify = false, reschedule = false;unsigned long flags, next_reconfig, delay; -rtnl_lock (); +/* if changes are happening, comeback later */ +if (!rtnl_trylock ()) { +schedule_delayed_work (&ndev_ctx->dwork,LINKCHANGE_INT ); +return ; + } +if (ndev_ctx->start_remove) goto out_unlock;
drivers/net/macsec.c +1 -0
@@ -3510,6 +3510,7 @@ module_init(macsec_init);module_exit (macsec_exit);MODULE_ALIAS_RTNL_LINK ("macsec" ); +MODULE_ALIAS_GENL_FAMILY ("macsec" );MODULE_DESCRIPTION ("MACsec IEEE 802.1AE" );MODULE_LICENSE ("GPL v2" );
drivers/net/phy/phy.c +0 -3
@@ -674,9 +674,6 @@ void phy_stop_machine(struct phy_device *phydev)if (phydev->state >PHY_UP && phydev->state !=PHY_HALTED ) phydev->state =PHY_UP ;mutex_unlock (&phydev->lock); - -/* Now we can run the state machine synchronously */ -phy_state_machine (&phydev->state_queue.work); }/**
drivers/vhost/net.c +6 -1
@@ -537,8 +537,13 @@ static int vhost_net_rx_peek_head_len(struct vhost_net *net, struct sock *sk)preempt_enable (); -if (vhost_enable_notify (&net->dev, vq)) +if (!vhost_vq_avail_empty (&net->dev, vq))vhost_poll_queue (&vq->poll); +else if (unlikely (vhost_enable_notify (&net->dev, vq))) { +vhost_disable_notify (&net->dev, vq); +vhost_poll_queue (&vq->poll); + } +mutex_unlock (&vq->mutex); len =peek_head_len (sk);
fs/f2fs/recovery.c +1 -3
@@ -316,7 +316,7 @@ static int check_index_in_prev_nodes(struct f2fs_sb_info *sbi,return 0 ;/* Get the previous summary */ -for (i =CURSEG_WARM_DATA ; i <=CURSEG_COLD_DATA ; i++) { +for (i =CURSEG_HOT_DATA ; i <=CURSEG_COLD_DATA ; i++) {struct curseg_info *curseg =CURSEG_I (sbi, i);if (curseg->segno == segno) { sum = curseg->sum_blk->entries[blkoff];
@@ -626,8 +626,6 @@ int recover_fsync_data(struct f2fs_sb_info *sbi, bool check_only) }clear_sbi_flag (sbi,SBI_POR_DOING ); -if (err) -set_ckpt_flags (sbi,CP_ERROR_FLAG );mutex_unlock (&sbi->cp_mutex);/* let's drop all the directory inodes for clean checkpoint */
fs/inode.c +1 -0
@@ -637,6 +637,7 @@ void evict_inodes(struct super_block *sb)dispose_list (&dispose); } +EXPORT_SYMBOL_GPL (evict_inodes);/** * invalidate_inodes - attempt to free all inodes on a superblock
fs/internal.h +0 -1
@@ -136,7 +136,6 @@ extern bool atime_needs_update_rcu(const struct path *, struct inode *);extern void inode_io_list_del (struct inode *inode);extern long get_nr_dirty_inodes (void ); -extern void evict_inodes (struct super_block *);extern int invalidate_inodes (struct super_block *,bool );/*
fs/iomap.c +2 -2
@@ -281,7 +281,7 @@ iomap_dirty_actor(struct inode *inode, loff_t pos, loff_t length, void *data,unsigned long bytes;/* Bytes to write to page */ offset = (pos & (PAGE_SIZE -1 )); - bytes = min_t(unsigned long, PAGE_SIZE - offset, length); + bytes =min_t (loff_t,PAGE_SIZE - offset, length); rpage =__iomap_read_page (inode, pos);if (IS_ERR (rpage))
@@ -376,7 +376,7 @@ iomap_zero_range_actor(struct inode *inode, loff_t pos, loff_t count,unsigned offset, bytes; offset = pos & (PAGE_SIZE -1 );/* Within page */ - bytes =min_t (unsigned,PAGE_SIZE - offset, count); + bytes =min_t (loff_t,PAGE_SIZE - offset, count);if (IS_DAX (inode)) status =iomap_dax_zero (pos, offset, bytes, iomap);
fs/xfs/libxfs/xfs_attr_leaf.c +1 -1
@@ -351,7 +351,7 @@ xfs_attr3_leaf_read( err =xfs_da_read_buf (tp, dp, bno, mappedbno, bpp,XFS_ATTR_FORK , &xfs_attr3_leaf_buf_ops); -if (!err && tp) +if (!err && tp && *bpp)xfs_trans_buf_set_type (tp, *bpp,XFS_BLFT_ATTR_LEAF_BUF );return err; }
fs/xfs/libxfs/xfs_bmap.c +50 -10
131 lines not on this page · raw message
fs/xfs/libxfs/xfs_bmap.h +1 -1
@@ -265,7 +265,7 @@ struct xfs_bmap_intent {int xfs_bmap_finish_one (struct xfs_trans *tp,struct xfs_defer_ops *dfops,struct xfs_inode *ip,enum xfs_bmap_intent_type type,int whichfork,xfs_fileoff_t startoff,xfs_fsblock_t startblock, -xfs_filblks_t blockcount,xfs_exntst_t state); +xfs_filblks_t *blockcount,xfs_exntst_t state);int xfs_bmap_map_extent (struct xfs_mount *mp,struct xfs_defer_ops *dfops,struct xfs_inode *ip,struct xfs_bmbt_irec *imap); int xfs_bmap_unmap_extent(struct xfs_mount *mp, struct xfs_defer_ops *dfops,
fs/xfs/libxfs/xfs_bmap_btree.c +1 -0
@@ -888,6 +888,7 @@ xfs_bmbt_change_owner( cur =xfs_bmbt_init_cursor (ip->i_mount, tp, ip, whichfork);if (!cur)return -ENOMEM ; + cur->bc_private.b.flags |=XFS_BTCUR_BPRV_INVALID_OWNER ; error =xfs_btree_change_owner (cur, new_owner, buffer_list);xfs_btree_del_cursor (cur, error ?XFS_BTREE_ERROR :XFS_BTREE_NOERROR );
fs/xfs/libxfs/xfs_btree.c +22 -11
@@ -714,7 +714,8 @@ xfs_btree_firstrec(* Get the block pointer for this level. */ block =xfs_btree_get_block (cur, level, &bp); -xfs_btree_check_block (cur, block, level, bp); +if (xfs_btree_check_block (cur, block, level, bp)) +return 0 ;/* * It's empty, there is no such record. */
@@ -743,7 +744,8 @@ xfs_btree_lastrec(* Get the block pointer for this level. */ block =xfs_btree_get_block (cur, level, &bp); -xfs_btree_check_block (cur, block, level, bp); +if (xfs_btree_check_block (cur, block, level, bp)) +return 0 ;/* * It's empty, there is no such record. */
@@ -1772,6 +1774,7 @@ xfs_btree_lookup_get_block(/* Check the inode owner since the verifiers don't. */ if (xfs_sb_version_hascrc (&cur->bc_mp->m_sb) && + !(cur->bc_private.b.flags &XFS_BTCUR_BPRV_INVALID_OWNER ) && (cur->bc_flags &XFS_BTREE_LONG_PTRS ) &&be64_to_cpu ((*blkp)->bb_u.l.bb_owner) != cur->bc_private.b.ip->i_ino)
@@ -4432,10 +4435,15 @@ xfs_btree_block_change_owner(/* modify the owner */ block =xfs_btree_get_block (cur, level, &bp); -if (cur->bc_flags &XFS_BTREE_LONG_PTRS ) +if (cur->bc_flags &XFS_BTREE_LONG_PTRS ) { +if (block->bb_u.l.bb_owner ==cpu_to_be64 (bbcoi->new_owner)) +return 0 ; block->bb_u.l.bb_owner =cpu_to_be64 (bbcoi->new_owner); -else + }else { +if (block->bb_u.s.bb_owner ==cpu_to_be32 (bbcoi->new_owner)) +return 0 ; block->bb_u.s.bb_owner =cpu_to_be32 (bbcoi->new_owner); + }/* * If the block is a root block hosted in an inode, we might not have a
@@ -4444,16 +4452,19 @@ xfs_btree_block_change_owner(* block is formatted into the on-disk inode fork. We still change it, * though, so everything is consistent in memory. */ -if (bp) { -if (cur->bc_tp) { -xfs_trans_ordered_buf (cur->bc_tp, bp); +if (!bp) { +ASSERT (cur->bc_flags &XFS_BTREE_ROOT_IN_INODE ); +ASSERT (level == cur->bc_nlevels -1 ); +return 0 ; + } + +if (cur->bc_tp) { +if (!xfs_trans_ordered_buf (cur->bc_tp, bp)) {xfs_btree_log_block (cur, bp,XFS_BB_OWNER ); - }else { -xfs_buf_delwri_queue (bp, bbcoi->buffer_list); +return -EAGAIN ; } }else { -ASSERT (cur->bc_flags &XFS_BTREE_ROOT_IN_INODE ); -ASSERT (level == cur->bc_nlevels -1 ); +xfs_buf_delwri_queue (bp, bbcoi->buffer_list); }return 0 ;
fs/xfs/libxfs/xfs_btree.h +2 -1
@@ -268,7 +268,8 @@ typedef struct xfs_btree_curshort forksize;/* fork's inode space */ char whichfork;/* data or attr fork */ char flags;/* flags */ -#define XFS_BTCUR_BPRV_WASDEL 1/* was delayed */ +#define XFS_BTCUR_BPRV_WASDEL (1<<0)/* was delayed */ +#define XFS_BTCUR_BPRV_INVALID_OWNER (1<<1)/* for ext swap */ } b; } bc_private;/* per-btree type data */ } xfs_btree_cur_t;
fs/xfs/libxfs/xfs_da_btree.c +1 -1
@@ -263,7 +263,7 @@ xfs_da3_node_read( err =xfs_da_read_buf (tp, dp, bno, mappedbno, bpp, which_fork, &xfs_da3_node_buf_ops); -if (!err && tp) { +if (!err && tp && *bpp) {struct xfs_da_blkinfo *info = (*bpp)->b_addr;int type;
fs/xfs/libxfs/xfs_dir2_block.c +1 -1
@@ -139,7 +139,7 @@ xfs_dir3_block_read( err =xfs_da_read_buf (tp, dp, mp->m_dir_geo->datablk,-1 , bpp,XFS_DATA_FORK , &xfs_dir3_block_buf_ops); -if (!err && tp) +if (!err && tp && *bpp)xfs_trans_buf_set_type (tp, *bpp,XFS_BLFT_DIR_BLOCK_BUF );return err; }
fs/xfs/libxfs/xfs_dir2_leaf.c +2 -2
@@ -268,7 +268,7 @@ xfs_dir3_leaf_read( err =xfs_da_read_buf (tp, dp, fbno, mappedbno, bpp,XFS_DATA_FORK , &xfs_dir3_leaf1_buf_ops); -if (!err && tp) +if (!err && tp && *bpp)xfs_trans_buf_set_type (tp, *bpp,XFS_BLFT_DIR_LEAF1_BUF );return err; }
@@ -285,7 +285,7 @@ xfs_dir3_leafn_read( err =xfs_da_read_buf (tp, dp, fbno, mappedbno, bpp,XFS_DATA_FORK , &xfs_dir3_leafn_buf_ops); -if (!err && tp) +if (!err && tp && *bpp)xfs_trans_buf_set_type (tp, *bpp,XFS_BLFT_DIR_LEAFN_BUF );return err; }
fs/xfs/libxfs/xfs_ialloc.c +28 -31
109 lines not on this page · raw message
fs/xfs/libxfs/xfs_inode_fork.c +3 -6
@@ -1539,14 +1539,11 @@ xfs_iext_realloc_indirect(xfs_ifork_t *ifp,/* inode fork pointer */ int new_size) /* new indirection array size */ { - int nlists; /* number of irec's (ex lists) */ -int size;/* current indirection array size */ - ASSERT(ifp->if_flags & XFS_IFEXTIREC); - nlists = ifp->if_real_bytes /XFS_IEXT_BUFSZ ; - size = nlists *sizeof (xfs_ext_irec_t);ASSERT (ifp->if_real_bytes); -ASSERT ((new_size >=0 ) && (new_size != size)); +ASSERT ((new_size >=0 ) && + (new_size != ((ifp->if_real_bytes /XFS_IEXT_BUFSZ ) * +sizeof (xfs_ext_irec_t))));if (new_size ==0 ) {xfs_iext_destroy (ifp); }else {
fs/xfs/libxfs/xfs_refcount.c +5 -9
@@ -784,14 +784,6 @@ xfs_refcount_merge_extents( }/* -* While we're adjusting the refcounts records of an extent, we have -* to keep an eye on the number of extents we're dirtying -- run too -* many in a single transaction and we'll exceed the transaction's -* reservation and crash the fs. Each record adds 12 bytes to the -* log (plus any key updates) so we'll conservatively assume 24 bytes -* per record. We must also leave space for btree splits on both ends -* of the range and space for the CUD and a new CUI. -* * XXX: This is a pretty hand-wavy estimate. The penalty for guessing * true incorrectly is a shutdown FS; the penalty for guessing false * incorrectly is more transaction rolls than might be necessary.
@@ -822,7 +814,7 @@ xfs_refcount_still_have_space(else if (overhead > cur->bc_tp->t_log_res)return false;return cur->bc_tp->t_log_res - overhead > - cur->bc_private.a.priv.refc.nr_ops *32 ; + cur->bc_private.a.priv.refc.nr_ops *XFS_REFCOUNT_ITEM_OVERHEAD ; }/*
@@ -1648,6 +1640,10 @@ xfs_refcount_recover_cow_leftovers( error =xfs_alloc_read_agf (mp, tp, agno,0 , &agbp);if (error) goto out_trans; +if (!agbp) { + error = -ENOMEM ; + goto out_trans; + } cur =xfs_refcountbt_init_cursor (mp, tp, agbp, agno,NULL );/* Find all the leftover CoW staging extents. */
fs/xfs/libxfs/xfs_refcount.h +16 -0
@@ -67,4 +67,20 @@ extern int xfs_refcount_free_cow_extent(struct xfs_mount *mp,extern int xfs_refcount_recover_cow_leftovers (struct xfs_mount *mp,xfs_agnumber_t agno); +/* +* While we're adjusting the refcounts records of an extent, we have +* to keep an eye on the number of extents we're dirtying -- run too +* many in a single transaction and we'll exceed the transaction's +* reservation and crash the fs. Each record adds 12 bytes to the +* log (plus any key updates) so we'll conservatively assume 32 bytes +* per record. We must also leave space for btree splits on both ends +* of the range and space for the CUD and a new CUI. +*/ +#define XFS_REFCOUNT_ITEM_OVERHEAD 32 + +static inline xfs_fileoff_t xfs_refcount_max_unmap (int log_res) +{ +return (log_res *3 /4 ) /XFS_REFCOUNT_ITEM_OVERHEAD ; +} +#endif /* __XFS_REFCOUNT_H__ */
fs/xfs/xfs_aops.c +53 -26
123 lines not on this page · raw message
fs/xfs/xfs_bmap_item.c +15 -2
@@ -395,6 +395,7 @@ xfs_bui_recover(struct xfs_map_extent *bmap;xfs_fsblock_t startblock_fsb;xfs_fsblock_t inode_fsb; +xfs_filblks_t count;bool op_ok;struct xfs_bud_log_item *budp;enum xfs_bmap_intent_type type;
@@ -403,6 +404,7 @@ xfs_bui_recover(struct xfs_trans *tp;struct xfs_inode *ip =NULL ;struct xfs_defer_ops dfops; +struct xfs_bmbt_irec irec;xfs_fsblock_t firstfsb;ASSERT (!test_bit (XFS_BUI_RECOVERED , &buip->bui_flags));
@@ -480,13 +482,24 @@ xfs_bui_recover( }xfs_trans_ijoin (tp, ip,0 ); + count = bmap->me_len; error =xfs_trans_log_finish_bmap_update (tp, budp, &dfops, type, ip, whichfork, bmap->me_startoff, - bmap->me_startblock, bmap->me_len, - state); + bmap->me_startblock, &count, state);if (error) goto err_dfops; +if (count >0 ) { +ASSERT (type ==XFS_BMAP_UNMAP ); + irec.br_startblock = bmap->me_startblock; + irec.br_blockcount = count; + irec.br_startoff = bmap->me_startoff; + irec.br_state = state; + error =xfs_bmap_unmap_extent (tp->t_mountp, &dfops, ip, &irec); +if (error) + goto err_dfops; + } +/* Finish transaction, free inodes. */ error =xfs_defer_finish (&tp, &dfops,NULL );if (error)
fs/xfs/xfs_bmap_util.c +70 -25
130 lines not on this page · raw message
fs/xfs/xfs_buf.c +61 -1
74 lines not on this page · raw message
fs/xfs/xfs_buf.h +1 -0
@@ -333,6 +333,7 @@ extern void xfs_buf_delwri_cancel(struct list_head *);extern bool xfs_buf_delwri_queue (struct xfs_buf *,struct list_head *);extern int xfs_buf_delwri_submit (struct list_head *);extern int xfs_buf_delwri_submit_nowait (struct list_head *); +extern int xfs_buf_delwri_pushbuf (struct xfs_buf *,struct list_head *);/* Buffer Daemon Setup Routines */ extern int xfs_buf_init (void );
fs/xfs/xfs_buf_item.c +101 -55
232 lines not on this page · raw message
fs/xfs/xfs_buf_item.h +4 -1
@@ -64,12 +64,15 @@ typedef struct xfs_buf_log_item {int xfs_buf_item_init (struct xfs_buf *,struct xfs_mount *);void xfs_buf_item_relse (struct xfs_buf *);void xfs_buf_item_log (xfs_buf_log_item_t *,uint ,uint ); -uint xfs_buf_item_dirty (xfs_buf_log_item_t *); +bool xfs_buf_item_dirty_format (struct xfs_buf_log_item *);void xfs_buf_attach_iodone (struct xfs_buf *,void (*)(struct xfs_buf *,xfs_log_item_t *),xfs_log_item_t *);void xfs_buf_iodone_callbacks (struct xfs_buf *);void xfs_buf_iodone (struct xfs_buf *,struct xfs_log_item *); +bool xfs_buf_resubmit_failed_buffers (struct xfs_buf *, +struct xfs_log_item *, +struct list_head *);extern kmem_zone_t *xfs_buf_item_zone;
fs/xfs/xfs_file.c +9 -30
@@ -729,6 +729,7 @@ xfs_file_buffered_aio_write(xfs_rw_iunlock (ip, iolock); eofb.eof_flags =XFS_EOF_FLAGS_SYNC ;xfs_icache_free_eofblocks (ip->i_mount, &eofb); +xfs_icache_free_cowblocks (ip->i_mount, &eofb); goto write_retry; }
@@ -1139,29 +1140,8 @@ xfs_find_get_desired_pgoff( want =min_t (pgoff_t, end - index,PAGEVEC_SIZE -1 ) +1 ; nr_pages =pagevec_lookup (&pvec, inode->i_mapping, index, want); -/* -* No page mapped into given range. If we are searching holes -* and if this is the first time we got into the loop, it means -* that the given offset is landed in a hole, return it. -* -* If we have already stepped through some block buffers to find -* holes but they all contains data. In this case, the last -* offset is already updated and pointed to the end of the last -* mapped page, if it does not reach the endpoint to search, -* that means there should be a hole between them. -*/ -if (nr_pages ==0 ) { -/* Data search found nothing */ -if (type ==DATA_OFF ) -break ; - -ASSERT (type ==HOLE_OFF ); -if (lastoff == startoff || lastoff < endoff) { - found = true; - *offset = lastoff; - } +if (nr_pages ==0 )break ; - }for (i =0 ; i < nr_pages; i++) {struct page *page = pvec.pages[i];
@@ -1227,21 +1207,20 @@ xfs_find_get_desired_pgoff(/* * The number of returned pages less than our desired, search -* done. In this case, nothing was found for searching data, -* but we found a hole behind the last offset. +* done. */ -if (nr_pages < want) { -if (type ==HOLE_OFF ) { - *offset = lastoff; - found = true; - } +if (nr_pages < want)break ; - } index = pvec.pages[i -1 ]->index +1 ;pagevec_release (&pvec); }while (index <= end); +/* No page at lastoff and we are not done - we found a hole. */ +if (type ==HOLE_OFF && lastoff < endoff) { + *offset = lastoff; + found = true; + } out:pagevec_release (&pvec);return found;
fs/xfs/xfs_icache.c +7 -8
@@ -66,7 +66,6 @@ xfs_inode_alloc(XFS_STATS_INC (mp, vn_active);ASSERT (atomic_read (&ip->i_pincount) ==0 ); -ASSERT (!spin_is_locked (&ip->i_flags_lock));ASSERT (!xfs_isiflocked (ip));ASSERT (ip->i_ino ==0 );
@@ -192,7 +191,7 @@ xfs_perag_set_reclaim_tag( {struct xfs_mount *mp = pag->pag_mount; -ASSERT (spin_is_locked (&pag->pag_ici_lock)); +lockdep_assert_held (&pag->pag_ici_lock);if (pag->pag_ici_reclaimable++)return ;
@@ -214,7 +213,7 @@ xfs_perag_clear_reclaim_tag( {struct xfs_mount *mp = pag->pag_mount; -ASSERT (spin_is_locked (&pag->pag_ici_lock)); +lockdep_assert_held (&pag->pag_ici_lock);if (--pag->pag_ici_reclaimable)return ;
@@ -1079,11 +1078,11 @@ xfs_reclaim_inode(* Because we use RCU freeing we need to ensure the inode always appears * to be reclaimed with an invalid inode number when in the free state. * We do this as early as possible under the ILOCK so that -* xfs_iflush_cluster() can be guaranteed to detect races with us here. -* By doing this, we guarantee that once xfs_iflush_cluster has locked -* XFS_ILOCK that it will see either a valid, flushable inode that will -* serialise correctly, or it will see a clean (and invalid) inode that -* it can skip. +* xfs_iflush_cluster() and xfs_ifree_cluster() can be guaranteed to +* detect races with us here. By doing this, we guarantee that once +* xfs_iflush_cluster() or xfs_ifree_cluster() has locked XFS_ILOCK that +* it will see either a valid inode that will serialise correctly, or it +* will see an invalid inode that it can skip. */ spin_lock (&ip->i_flags_lock); ip->i_flags =XFS_IRECLAIM ;
fs/xfs/xfs_inode.c +25 -10
@@ -881,7 +881,6 @@ xfs_ialloc(case S_IFREG :case S_IFDIR :if (pip && (pip->i_d.di_flags &XFS_DIFLAG_ANY )) { -uint64_t di_flags2 =0 ;uint di_flags =0 ;if (S_ISDIR (mode)) {
@@ -918,20 +917,23 @@ xfs_ialloc( di_flags |=XFS_DIFLAG_NODEFRAG ;if (pip->i_d.di_flags &XFS_DIFLAG_FILESTREAM ) di_flags |=XFS_DIFLAG_FILESTREAM ; -if (pip->i_d.di_flags2 &XFS_DIFLAG2_DAX ) - di_flags2 |=XFS_DIFLAG2_DAX ; ip->i_d.di_flags |= di_flags; - ip->i_d.di_flags2 |= di_flags2; }if (pip && (pip->i_d.di_flags2 &XFS_DIFLAG2_ANY ) && pip->i_d.di_version ==3 && ip->i_d.di_version ==3 ) { +uint64_t di_flags2 =0 ; +if (pip->i_d.di_flags2 &XFS_DIFLAG2_COWEXTSIZE ) { - ip->i_d.di_flags2 |=XFS_DIFLAG2_COWEXTSIZE ; + di_flags2 |=XFS_DIFLAG2_COWEXTSIZE ; ip->i_d.di_cowextsize = pip->i_d.di_cowextsize; } +if (pip->i_d.di_flags2 &XFS_DIFLAG2_DAX ) + di_flags2 |=XFS_DIFLAG2_DAX ; + + ip->i_d.di_flags2 |= di_flags2; }/* FALLTHROUGH */ case S_IFLNK :
@@ -2366,11 +2368,24 @@ xfs_ifree_cluster(* already marked stale. If we can't lock it, back off * and retry. */ -if (ip != free_ip && - !xfs_ilock_nowait (ip,XFS_ILOCK_EXCL )) { -rcu_read_unlock (); -delay (1 ); - goto retry; +if (ip != free_ip) { +if (!xfs_ilock_nowait (ip,XFS_ILOCK_EXCL )) { +rcu_read_unlock (); +delay (1 ); + goto retry; + } + +/* +* Check the inode number again in case we're +* racing with freeing in xfs_reclaim_inode(). +* See the comments in that function for more +* information as to why the initial check is +* not sufficient. +*/ +if (ip->i_ino != inum + i) { +xfs_iunlock (ip,XFS_ILOCK_EXCL ); +continue ; + } }rcu_read_unlock ();
fs/xfs/xfs_inode_item.c +59 -15
127 lines not on this page · raw message
fs/xfs/xfs_ioctl.c +27 -14
86 lines not on this page · raw message
fs/xfs/xfs_iops.c +1 -1
@@ -802,7 +802,7 @@ xfs_vn_setattr_nonsize(* Caution: The caller of this function is responsible for calling * setattr_prepare() or otherwise verifying the change is fine. */ -int +STATIC intxfs_setattr_size (struct xfs_inode *ip,struct iattr *iattr)
fs/xfs/xfs_log.c +35 -9
86 lines not on this page · raw message
fs/xfs/xfs_log_recover.c +121 -61
291 lines not on this page · raw message
fs/xfs/xfs_mount.c +2 -10
@@ -924,15 +924,6 @@ xfs_mountfs( } } -/* -* During the second phase of log recovery, we need iget and -* iput to behave like they do for an active filesystem. -* xfs_fs_drop_inode needs to be able to prevent the deletion -* of inodes before we're done replaying log items on those -* inodes. -*/ - mp->m_super->s_flags |=MS_ACTIVE ; -/* * Finish recovering the file system. This part needed to be delayed * until after the root and real-time bitmap inodes were consistently
@@ -1008,12 +999,13 @@ xfs_mountfs( out_quota:xfs_qm_unmount_quotas (mp); out_rtunmount: - mp->m_super->s_flags &= ~MS_ACTIVE ;xfs_rtunmount_inodes (mp); out_rele_rip:IRELE (rip);cancel_delayed_work_sync (&mp->m_reclaim_work);xfs_reclaim_inodes (mp,SYNC_WAIT ); +/* Clean out dquots that might be in memory after quotacheck. */ +xfs_qm_unmount (mp); out_log_dealloc: mp->m_flags |=XFS_MOUNT_UNMOUNTING ;xfs_log_mount_cancel (mp);
fs/xfs/xfs_qm.c +30 -1
@@ -111,6 +111,9 @@ xfs_qm_dquot_walk( skipped =0 ;break ; } +/* we're done if id overflows back to zero */ +if (!next_index) +break ; }if (skipped) {
@@ -1247,6 +1250,7 @@ xfs_qm_flush_one(struct xfs_dquot *dqp, void *data) { + struct xfs_mount *mp = dqp->q_mount;struct list_head *buffer_list = data;struct xfs_buf *bp =NULL ;int error =0 ;
@@ -1257,7 +1261,32 @@ xfs_qm_flush_one(if (!XFS_DQ_IS_DIRTY (dqp)) goto out_unlock; -xfs_dqflock (dqp); +/* +* The only way the dquot is already flush locked by the time quotacheck +* gets here is if reclaim flushed it before the dqadjust walk dirtied +* it for the final time. Quotacheck collects all dquot bufs in the +* local delwri queue before dquots are dirtied, so reclaim can't have +* possibly queued it for I/O. The only way out is to push the buffer to +* cycle the flush lock. +*/ +if (!xfs_dqflock_nowait (dqp)) { +/* buf is pinned in-core by delwri list */ +DEFINE_SINGLE_BUF_MAP (map, dqp->q_blkno, + mp->m_quotainfo->qi_dqchunklen); + bp =_xfs_buf_find (mp->m_ddev_targp, &map,1 ,0 ,NULL ); +if (!bp) { + error = -EINVAL ; + goto out_unlock; + } +xfs_buf_unlock (bp); + +xfs_buf_delwri_pushbuf (bp, buffer_list); +xfs_buf_rele (bp); + + error = -EAGAIN ; + goto out_unlock; + } + error =xfs_qm_dqflush (dqp, &bp);if (error) goto out_unlock;
fs/xfs/xfs_reflink.c +3 -1
@@ -169,6 +169,8 @@ xfs_reflink_find_shared( error =xfs_alloc_read_agf (mp,NULL , agno,0 , &agbp);if (error)return error; +if (!agbp) +return -ENOMEM ; cur =xfs_refcountbt_init_cursor (mp,NULL , agbp, agno,NULL );
@@ -333,7 +335,7 @@ xfs_reflink_convert_cow_extent( struct xfs_defer_ops *dfops) {struct xfs_bmbt_irec irec = *imap; -xfs_fsblock_t first_block; +xfs_fsblock_t first_block =NULLFSBLOCK ;int nimaps =1 ;if (imap->br_state ==XFS_EXT_NORM )
fs/xfs/xfs_super.c +1 -1
@@ -1214,7 +1214,7 @@ xfs_test_remount_options( tmp_mp->m_super = sb; error =xfs_parseargs (tmp_mp, options);xfs_free_fsname (tmp_mp); -kfree (tmp_mp); +kmem_free (tmp_mp);return error; }
fs/xfs/xfs_trace.h +19 -1
@@ -366,6 +366,7 @@ DEFINE_BUF_EVENT(xfs_buf_iowait_done);DEFINE_BUF_EVENT (xfs_buf_delwri_queue);DEFINE_BUF_EVENT (xfs_buf_delwri_queued);DEFINE_BUF_EVENT (xfs_buf_delwri_split); +DEFINE_BUF_EVENT (xfs_buf_delwri_pushbuf);DEFINE_BUF_EVENT (xfs_buf_get_uncached);DEFINE_BUF_EVENT (xfs_bdstrat_shut);DEFINE_BUF_EVENT (xfs_buf_item_relse);
@@ -519,7 +520,6 @@ DEFINE_BUF_ITEM_EVENT(xfs_buf_item_size);DEFINE_BUF_ITEM_EVENT (xfs_buf_item_size_ordered);DEFINE_BUF_ITEM_EVENT (xfs_buf_item_size_stale);DEFINE_BUF_ITEM_EVENT (xfs_buf_item_format); -DEFINE_BUF_ITEM_EVENT (xfs_buf_item_format_ordered);DEFINE_BUF_ITEM_EVENT (xfs_buf_item_format_stale);DEFINE_BUF_ITEM_EVENT (xfs_buf_item_ordered);DEFINE_BUF_ITEM_EVENT (xfs_buf_item_pin);
@@ -1990,6 +1990,24 @@ DEFINE_EVENT(xfs_swap_extent_class, name, \DEFINE_SWAPEXT_EVENT (xfs_swap_extent_before);DEFINE_SWAPEXT_EVENT (xfs_swap_extent_after); +TRACE_EVENT (xfs_log_recover, + TP_PROTO(struct xlog *log, xfs_daddr_t headblk, xfs_daddr_t tailblk), +TP_ARGS (log, headblk, tailblk), +TP_STRUCT__entry ( + __field(dev_t, dev) + __field(xfs_daddr_t, headblk) +__field (xfs_daddr_t, tailblk) + ), +TP_fast_assign ( + __entry->dev = log->l_mp->m_super->s_dev; + __entry->headblk = headblk; + __entry->tailblk = tailblk; + ), +TP_printk ("dev %d:%d headblk 0x%llx tailblk 0x%llx" , +MAJOR (__entry->dev),MINOR (__entry->dev), __entry->headblk, + __entry->tailblk) +) + TRACE_EVENT(xfs_log_recover_record, TP_PROTO(struct xlog *log, struct xlog_rec_header *rhead, int pass), TP_ARGS(log, rhead, pass),
fs/xfs/xfs_trans.h +11 -5
@@ -50,6 +50,7 @@ typedef struct xfs_log_item {struct xfs_ail *li_ailp;/* ptr to AIL */ uint li_type;/* item type */ uint li_flags;/* misc flags */ +struct xfs_buf *li_buf;/* real buffer pointer */ struct xfs_log_item *li_bio_list;/* buffer item list */ void (*li_cb)(struct xfs_buf *,struct xfs_log_item *);
@@ -65,11 +66,13 @@ typedef struct xfs_log_item { } xfs_log_item_t;#define XFS_LI_IN_AIL 0x1 -#define XFS_LI_ABORTED 0x2 +#define XFS_LI_ABORTED 0x2 +#define XFS_LI_FAILED 0x4#define XFS_LI_FLAGS \ { XFS_LI_IN_AIL, "IN_AIL" }, \ - { XFS_LI_ABORTED, "ABORTED" } + { XFS_LI_ABORTED, "ABORTED" }, \ + { XFS_LI_FAILED, "FAILED" }struct xfs_item_ops {void (*iop_size)(xfs_log_item_t *,int *,int *);
@@ -80,6 +83,7 @@ struct xfs_item_ops {void (*iop_unlock)(xfs_log_item_t *);xfs_lsn_t (*iop_committed)(xfs_log_item_t *,xfs_lsn_t );void (*iop_committing)(xfs_log_item_t *,xfs_lsn_t ); +void (*iop_error)(xfs_log_item_t *,xfs_buf_t *); }; void xfs_log_item_init(struct xfs_mount *mp, struct xfs_log_item *item,
@@ -213,12 +217,14 @@ void xfs_trans_bhold_release(xfs_trans_t *, struct xfs_buf *);void xfs_trans_binval (xfs_trans_t *,struct xfs_buf *);void xfs_trans_inode_buf (xfs_trans_t *,struct xfs_buf *);void xfs_trans_stale_inode_buf (xfs_trans_t *,struct xfs_buf *); -void xfs_trans_ordered_buf (xfs_trans_t *,struct xfs_buf *); +bool xfs_trans_ordered_buf (xfs_trans_t *,struct xfs_buf *);void xfs_trans_dquot_buf (xfs_trans_t *,struct xfs_buf *,uint );void xfs_trans_inode_alloc_buf (xfs_trans_t *,struct xfs_buf *);void xfs_trans_ichgtime (struct xfs_trans *,struct xfs_inode *,int );void xfs_trans_ijoin (struct xfs_trans *,struct xfs_inode *,uint ); -void xfs_trans_log_buf (xfs_trans_t *,struct xfs_buf *,uint ,uint ); +void xfs_trans_log_buf (struct xfs_trans *,struct xfs_buf *,uint , +uint ); +void xfs_trans_dirty_buf (struct xfs_trans *,struct xfs_buf *);void xfs_trans_log_inode (xfs_trans_t *,struct xfs_inode *,uint );void xfs_extent_free_init_defer_op (void );
@@ -277,6 +283,6 @@ int xfs_trans_log_finish_bmap_update(struct xfs_trans *tp, struct xfs_bud_log_item *rudp, struct xfs_defer_ops *dfops, enum xfs_bmap_intent_type type, struct xfs_inode *ip, int whichfork, xfs_fileoff_t startoff, xfs_fsblock_t startblock, - xfs_filblks_t blockcount, xfs_exntst_t state); + xfs_filblks_t *blockcount, xfs_exntst_t state);#endif /* __XFS_TRANS_H__ */
fs/xfs/xfs_trans_ail.c +36 -36
96 lines not on this page · raw message
fs/xfs/xfs_trans_bmap.c +9 -2
@@ -63,7 +63,7 @@ xfs_trans_log_finish_bmap_update(int whichfork, xfs_fileoff_t startoff, xfs_fsblock_t startblock, - xfs_filblks_t blockcount, + xfs_filblks_t *blockcount, xfs_exntst_t state) { int error;
@@ -196,16 +196,23 @@ xfs_bmap_update_finish_item( void **state) {struct xfs_bmap_intent *bmap; +xfs_filblks_t count;int error; bmap = container_of(item, struct xfs_bmap_intent, bi_list); + count = bmap->bi_bmap.br_blockcount; error =xfs_trans_log_finish_bmap_update (tp, done_item, dop, bmap->bi_type, bmap->bi_owner, bmap->bi_whichfork, bmap->bi_bmap.br_startoff, bmap->bi_bmap.br_startblock, - bmap->bi_bmap.br_blockcount, + &count, bmap->bi_bmap.br_state); +if (!error && count >0 ) { +ASSERT (bmap->bi_type ==XFS_BMAP_UNMAP ); + bmap->bi_bmap.br_blockcount = count; +return -EAGAIN ; + }kmem_free (bmap);return error; }
fs/xfs/xfs_trans_buf.c +62 -36
156 lines not on this page · raw message
fs/xfs/xfs_trans_priv.h +34 -12
56 lines not on this page · raw message
include/linux/fs.h +1 -0
@@ -2760,6 +2760,7 @@ static inline void lockdep_annotate_inode_mutex_key(struct inode *inode) { };#endif extern void unlock_new_inode (struct inode *);extern unsigned int get_next_ino (void ); +extern void evict_inodes (struct super_block *sb);extern void __iget (struct inode * inode);extern void iget_failed (struct inode *);
include/linux/netdevice.h +2 -0
@@ -3901,6 +3901,8 @@ struct net_device *netdev_all_upper_get_next_dev_rcu(struct net_device *dev,updev ; \ updev = netdev_all_upper_get_next_dev_rcu(dev, &(iter))) +bool netdev_has_any_upper_dev (struct net_device *dev); +void *netdev_lower_get_next_private (struct net_device *dev,struct list_head **iter); void *netdev_lower_get_next_private_rcu(struct net_device *dev,
include/net/inet_frag.h +9 -32
75 lines not on this page · raw message
include/net/ip6_fib.h +30 -2
@@ -68,6 +68,7 @@ struct fib6_node {__u16 fn_flags;int fn_sernum;struct rt6_info *rr_ptr; +struct rcu_head rcu; };#ifndef CONFIG_IPV6_SUBTREES
@@ -102,7 +103,7 @@ struct rt6_info {* the same cache line. */ struct fib6_table *rt6i_table; -struct fib6_node *rt6i_node; +struct fib6_node __rcu *rt6i_node;struct in6_addr rt6i_gateway;
@@ -165,13 +166,40 @@ static inline void rt6_update_expires(struct rt6_info *rt0, int timeout) rt0->rt6i_flags |=RTF_EXPIRES ; } +/* Function to safely get fn->sernum for passed in rt +* and store result in passed in cookie. +* Return true if we can get cookie safely +* Return false if not +*/ +static inline bool rt6_get_cookie_safe (const struct rt6_info *rt, +u32 *cookie) +{ +struct fib6_node *fn; +bool status = false; + +rcu_read_lock (); + fn =rcu_dereference (rt->rt6i_node); + +if (fn) { + *cookie = fn->fn_sernum; + status = true; + } + +rcu_read_unlock (); +return status; +} +static inline u32 rt6_get_cookie (const struct rt6_info *rt) { +u32 cookie =0 ; +if (rt->rt6i_flags &RTF_PCPU || (unlikely (rt->dst.flags &DST_NOCACHE ) && rt->dst.from)) rt = (struct rt6_info *)(rt->dst.from); -return rt->rt6i_node ? rt->rt6i_node->fn_sernum :0 ; +rt6_get_cookie_safe (rt, &cookie); + +return cookie; }static inline void ip6_rt_put (struct rt6_info *rt)
net/bridge/br_device.c +3 -0
@@ -53,6 +53,9 @@ netdev_tx_t br_dev_xmit(struct sk_buff *skb, struct net_device *dev) brstats->tx_bytes += skb->len;u64_stats_update_end (&brstats->syncp); +#ifdef CONFIG_NET_SWITCHDEV + skb->offload_fwd_mark =0 ; +#endif BR_INPUT_SKB_CB (skb)->brdev = dev;skb_reset_mac_header (skb);
net/core/datagram.c +1 -1
@@ -351,7 +351,7 @@ int skb_kill_datagram(struct sock *sk, struct sk_buff *skb, unsigned int flags)if (flags &MSG_PEEK ) { err = -ENOENT ;spin_lock_bh (&sk->sk_receive_queue.lock); -if (skb ==skb_peek (&sk->sk_receive_queue)) { +if (skb->next) {__skb_unlink (skb, &sk->sk_receive_queue);atomic_dec (&skb->users); err =0 ;
net/core/dev.c +2 -1
@@ -5337,12 +5337,13 @@ EXPORT_SYMBOL(netdev_has_upper_dev);* Find out if a device is linked to an upper device and return true in case * it is. The caller must hold the RTNL lock. */ -static bool netdev_has_any_upper_dev (struct net_device *dev) +bool netdev_has_any_upper_dev (struct net_device *dev) {ASSERT_RTNL ();return !list_empty (&dev->all_adj_list.upper); } +EXPORT_SYMBOL (netdev_has_any_upper_dev);/** * netdev_master_upper_dev_get - Get master upper device
net/ieee802154/6lowpan/reassembly.c +3 -8
@@ -580,19 +580,14 @@ static int __net_init lowpan_frags_init_net(struct net *net) {struct netns_ieee802154_lowpan *ieee802154_lowpan =net_ieee802154_lowpan (net); -int res; ieee802154_lowpan->frags.high_thresh =IPV6_FRAG_HIGH_THRESH ; ieee802154_lowpan->frags.low_thresh =IPV6_FRAG_LOW_THRESH ;
Lines of this file are not shown. View the raw message.
net/ipv6/ip6_fib.c +42 -14
56 lines not on this page · raw message
net/ipv6/netfilter/nf_conntrack_reasm.c +3 -9
Lines of this file are not shown. View the raw message.
The rest of this diff is not shown. View the raw message.
Part of the diff is not shown here. View the raw message.