Merge 4.19.323 into android-4.19-stable
Changes in 4.19.323 staging: iio: frequency: ad9833: Get frequency value statically staging: iio: frequency: ad9833: Load clock using clock framework staging: iio: frequency: ad9834: Validate frequency parameter value usbnet: ipheth: fix carrier detection in modes 1 and 4 net: ethernet: use ip_hdrlen() instead of bit shift net: phy: vitesse: repair vsc73xx autonegotiation scripts: kconfig: merge_config: config files: add a trailing newline arm64: dts: rockchip: override BIOS_DISABLE signal via GPIO hog on RK3399 Puma net/mlx5: Update the list of the PCI supported devices net: ftgmac100: Enable TX interrupt to avoid TX timeout net: dpaa: Pad packets to ETH_ZLEN soundwire: stream: Revert "soundwire: stream: fix programming slave ports for non-continous port maps" selftests/vm: remove call to ksft_set_plan() selftests/kcmp: remove call to ksft_set_plan() ASoC: allow module autoloading for table db1200_pids pinctrl: at91: make it work with current gpiolib microblaze: don't treat zero reserved memory regions as error net: ftgmac100: Ensure tx descriptor updates are visible wifi: iwlwifi: mvm: fix iwl_mvm_max_scan_ie_fw_cmd_room() wifi: iwlwifi: mvm: don't wait for tx queues if firmware is dead ASoC: tda7419: fix module autoloading spi: bcm63xx: Enable module autoloading x86/hyperv: Set X86_FEATURE_TSC_KNOWN_FREQ when Hyper-V provides frequency ocfs2: add bounds checking to ocfs2_xattr_find_entry() ocfs2: strict bound check before memcmp in ocfs2_xattr_find_entry() gpio: prevent potential speculation leaks in gpio_device_get_desc() USB: serial: pl2303: add device id for Macrosilicon MS3020 ACPI: PMIC: Remove unneeded check in tps68470_pmic_opregion_probe() wifi: ath9k: fix parameter check in ath9k_init_debug() wifi: ath9k: Remove error checks when creating debugfs entries netfilter: nf_tables: elements with timeout below CONFIG_HZ never expire wifi: cfg80211: fix UBSAN noise in cfg80211_wext_siwscan() wifi: cfg80211: fix two more possible UBSAN-detected off-by-one errors wifi: mac80211: use two-phase skb reclamation in ieee80211_do_stop() can: bcm: Clear bo->bcm_proc_read after remove_proc_entry(). Bluetooth: btusb: Fix not handling ZPL/short-transfer block, bfq: fix possible UAF for bfqq->bic with merge chain block, bfq: choose the last bfqq from merge chain in bfq_setup_cooperator() block, bfq: don't break merge chain in bfq_split_bfqq() spi: ppc4xx: handle irq_of_parse_and_map() errors spi: ppc4xx: Avoid returning 0 when failed to parse and map IRQ ARM: versatile: fix OF node leak in CPUs prepare reset: berlin: fix OF node leak in probe() error path clocksource/drivers/qcom: Add missing iounmap() on errors in msm_dt_timer_init() hwmon: (max16065) Fix overflows seen when writing limits mtd: slram: insert break after errors in parsing the map hwmon: (ntc_thermistor) fix module autoloading power: supply: max17042_battery: Fix SOC threshold calc w/ no current sense fbdev: hpfb: Fix an error handling path in hpfb_dio_probe() drm/stm: Fix an error handling path in stm_drm_platform_probe() drm/amd: fix typo drm/amdgpu: Replace one-element array with flexible-array member drm/amdgpu: properly handle vbios fake edid sizing drm/radeon: Replace one-element array with flexible-array member drm/radeon: properly handle vbios fake edid sizing drm/rockchip: vop: Allow 4096px width scaling drm/radeon/evergreen_cs: fix int overflow errors in cs track offsets jfs: fix out-of-bounds in dbNextAG() and diAlloc() drm/msm/a5xx: properly clear preemption records on resume drm/msm/a5xx: fix races in preemption evaluation stage ipmi: docs: don't advertise deprecated sysfs entries drm/msm: fix %s null argument error xen: use correct end address of kernel for conflict checking xen/swiotlb: simplify range_straddles_page_boundary() xen/swiotlb: add alignment check for dma buffers selftests/bpf: Fix error compiling test_lru_map.c xz: cleanup CRC32 edits from 2018 kthread: add kthread_work tracepoints kthread: fix task state in kthread worker if being frozen jbd2: introduce/export functions jbd2_journal_submit|finish_inode_data_buffers() ext4: clear EXT4_GROUP_INFO_WAS_TRIMMED_BIT even mount with discard smackfs: Use rcu_assign_pointer() to ensure safe assignment in smk_set_cipso ext4: avoid negative min_clusters in find_group_orlov() ext4: return error on ext4_find_inline_entry ext4: avoid OOB when system.data xattr changes underneath the filesystem nilfs2: fix potential null-ptr-deref in nilfs_btree_insert() nilfs2: determine empty node blocks as corrupted nilfs2: fix potential oob read in nilfs_btree_check_delete() perf sched timehist: Fix missing free of session in perf_sched__timehist() perf sched timehist: Fixed timestamp error when unable to confirm event sched_in time perf time-utils: Fix 32-bit nsec parsing clk: rockchip: Set parent rate for DCLK_VOP clock on RK3228 drivers: media: dvb-frontends/rtl2832: fix an out-of-bounds write error drivers: media: dvb-frontends/rtl2830: fix an out-of-bounds write error PCI: xilinx-nwl: Fix register misspelling RDMA/iwcm: Fix WARNING:at_kernel/workqueue.c:#check_flush_dependency pinctrl: single: fix missing error code in pcs_probe() clk: ti: dra7-atl: Fix leak of of_nodes pinctrl: mvebu: Fix devinit_dove_pinctrl_probe function RDMA/cxgb4: Added NULL check for lookup_atid ntb: intel: Fix the NULL vs IS_ERR() bug for debugfs_create_dir() nfsd: call cache_put if xdr_reserve_space returns NULL f2fs: enhance to update i_mode and acl atomically in f2fs_setattr() f2fs: fix typo f2fs: fix to update i_ctime in __f2fs_setxattr() f2fs: remove unneeded check condition in __f2fs_setxattr() f2fs: reduce expensive checkpoint trigger frequency coresight: tmc: sg: Do not leak sg_table netfilter: nf_reject_ipv6: fix nf_reject_ip6_tcphdr_put() net: seeq: Fix use after free vulnerability in ether3 Driver Due to Race Condition tcp: introduce tcp_skb_timestamp_us() helper tcp: check skb is non-NULL in tcp_rto_delta_us() net: qrtr: Update packets cloning when broadcasting netfilter: ctnetlink: compile ctnetlink_label_size with CONFIG_NF_CONNTRACK_EVENTS crypto: aead,cipher - zeroize key buffer after use Remove *.orig pattern from .gitignore soc: versatile: integrator: fix OF node leak in probe() error path USB: appledisplay: close race between probe and completion handler USB: misc: cypress_cy7c63: check for short transfer firmware_loader: Block path traversal tty: rp2: Fix reset with non forgiving PCIe host bridges drbd: Fix atomicity violation in drbd_uuid_set_bm() drbd: Add NULL check for net_conf to prevent dereference in state validation ACPI: sysfs: validate return type of _STR method f2fs: prevent possible int overflow in dir_block_index() f2fs: avoid potential int overflow in sanity_check_area_boundary() vfs: fix race between evice_inodes() and find_inode()&iput() fs: Fix file_set_fowner LSM hook inconsistencies nfs: fix memory leak in error path of nfs4_do_reclaim PCI: xilinx-nwl: Use irq_data_get_irq_chip_data() PCI: xilinx-nwl: Fix off-by-one in INTx IRQ handler soc: versatile: realview: fix memory leak during device remove soc: versatile: realview: fix soc_dev leak during device remove usb: yurex: Replace snprintf() with the safer scnprintf() variant USB: misc: yurex: fix race between read and write pps: remove usage of the deprecated ida_simple_xx() API pps: add an error check in parport_attach i2c: aspeed: Update the stop sw state when the bus recovery occurs i2c: isch: Add missed 'else' usb: yurex: Fix inconsistent locking bug in yurex_read() mailbox: rockchip: fix a typo in module autoloading mailbox: bcm2835: Fix timeout during suspend mode ceph: remove the incorrect Fw reference check when dirtying pages netfilter: uapi: NFTA_FLOWTABLE_HOOK is NLA_NESTED netfilter: nf_tables: prevent nf_skb_duplicated corruption r8152: Factor out OOB link list waits net: ethernet: lantiq_etop: fix memory disclosure net: avoid potential underflow in qdisc_pkt_len_init() with UFO net: add more sanity checks to qdisc_pkt_len_init() ipv4: ip_gre: Fix drops of small packets in ipgre_xmit sctp: set sk_state back to CLOSED if autobind fails in sctp_listen_start ALSA: hda/generic: Unconditionally prefer preferred_dacs pairs ALSA: hda/conexant: Fix conflicting quirk for System76 Pangolin f2fs: Require FMODE_WRITE for atomic write ioctls wifi: ath9k: fix possible integer overflow in ath9k_get_et_stats() wifi: ath9k_htc: Use __skb_set_length() for resetting urb before resubmit net: hisilicon: hip04: fix OF node leak in probe() net: hisilicon: hns_dsaf_mac: fix OF node leak in hns_mac_get_info() net: hisilicon: hns_mdio: fix OF node leak in probe() ACPICA: Fix memory leak if acpi_ps_get_next_namepath() fails ACPICA: Fix memory leak if acpi_ps_get_next_field() fails ACPI: EC: Do not release locks during operation region accesses ACPICA: check null return of ACPI_ALLOCATE_ZEROED() in acpi_db_convert_to_package() tipc: guard against string buffer overrun net: mvpp2: Increase size of queue_name buffer ipv4: Check !in_dev earlier for ioctl(SIOCSIFADDR). ipv4: Mask upper DSCP bits and ECN bits in NETLINK_FIB_LOOKUP family tcp: avoid reusing FIN_WAIT2 when trying to find port in connect() process ACPICA: iasl: handle empty connection_node wifi: mwifiex: Fix memcpy() field-spanning write warning in mwifiex_cmd_802_11_scan_ext() signal: Replace BUG_ON()s ALSA: asihpi: Fix potential OOB array access ALSA: hdsp: Break infinite MIDI input flush loop fbdev: pxafb: Fix possible use after free in pxafb_task() power: reset: brcmstb: Do not go into infinite loop if reset fails ata: sata_sil: Rename sil_blacklist to sil_quirks jfs: UBSAN: shift-out-of-bounds in dbFindBits jfs: Fix uaf in dbFreeBits jfs: check if leafidx greater than num leaves per dmap tree jfs: Fix uninit-value access of new_ea in ea_buffer drm/amd/display: Check stream before comparing them drm/amd/display: Fix index out of bounds in degamma hardware format translation drm/printer: Allow NULL data in devcoredump printer scsi: aacraid: Rearrange order of struct aac_srb_unit drm/radeon/r100: Handle unknown family in r100_cp_init_microcode() of/irq: Refer to actual buffer size in of_irq_parse_one() ext4: ext4_search_dir should return a proper error ext4: fix i_data_sem unlock order in ext4_ind_migrate() spi: s3c64xx: fix timeout counters in flush_fifo selftests: breakpoints: use remaining time to check if suspend succeed selftests: vDSO: fix vDSO symbols lookup for powerpc64 i2c: xiic: Wait for TX empty to avoid missed TX NAKs spi: bcm63xx: Fix module autoloading perf/core: Fix small negative period being ignored parisc: Fix itlb miss handler for 64-bit programs ALSA: core: add isascii() check to card ID generator ext4: no need to continue when the number of entries is 1 ext4: propagate errors from ext4_find_extent() in ext4_insert_range() ext4: fix incorrect tid assumption in __jbd2_log_wait_for_space() ext4: aovid use-after-free in ext4_ext_insert_extent() ext4: fix double brelse() the buffer of the extents path ext4: fix incorrect tid assumption in ext4_wait_for_tail_page_commit() parisc: Fix 64-bit userspace syscall path of/irq: Support #msi-cells=<0> in of_msi_get_domain jbd2: stop waiting for space when jbd2_cleanup_journal_tail() returns error ocfs2: fix the la space leak when unmounting an ocfs2 volume ocfs2: fix uninit-value in ocfs2_get_block() ocfs2: reserve space for inline xattr before attaching reflink tree ocfs2: cancel dqi_sync_work before freeing oinfo ocfs2: remove unreasonable unlock in ocfs2_read_blocks ocfs2: fix null-ptr-deref when journal load failed. ocfs2: fix possible null-ptr-deref in ocfs2_set_buffer_uptodate riscv: define ILLEGAL_POINTER_VALUE for 64bit aoe: fix the potential use-after-free problem in more places clk: rockchip: fix error for unknown clocks media: uapi/linux/cec.h: cec_msg_set_reply_to: zero flags media: venus: fix use after free bug in venus_remove due to race condition iio: magnetometer: ak8975: Fix reading for ak099xx sensors tomoyo: fallback to realpath if symlink's pathname does not exist Input: adp5589-keys - fix adp5589_gpio_get_value() btrfs: wait for fixup workers before stopping cleaner kthread during umount gpio: davinci: fix lazy disable ext4: avoid ext4_error()'s caused by ENOMEM in the truncate path ext4: fix slab-use-after-free in ext4_split_extent_at() ext4: update orig_path in ext4_find_extent() arm64: Add Cortex-715 CPU part definition arm64: cputype: Add Neoverse-N3 definitions arm64: errata: Expand speculative SSBS workaround once more uprobes: fix kernel info leak via "[uprobes]" vma nfsd: use ktime_get_seconds() for timestamps nfsd: fix delegation_blocked() to block correctly for at least 30 seconds rtc: at91sam9: drop platform_data support rtc: at91sam9: fix OF node leak in probe() error path ACPI: battery: Simplify battery hook locking ACPI: battery: Fix possible crash when unregistering a battery hook ext4: fix inode tree inconsistency caused by ENOMEM net: ethernet: cortina: Drop TSO support tracing: Remove precision vsnprintf() check from print event drm: Move drm_mode_setcrtc() local re-init to failure path drm/crtc: fix uninitialized variable use even harder virtio_console: fix misc probe bugs Input: synaptics-rmi4 - fix UAF of IRQ domain on driver removal bpf: Check percpu map value size first s390/facility: Disable compile time optimization for decompressor code s390/mm: Add cond_resched() to cmm_alloc/free_pages() ext4: nested locking for xattr inode s390/cpum_sf: Remove WARN_ON_ONCE statements ktest.pl: Avoid false positives with grub2 skip regex clk: bcm: bcm53573: fix OF node leak in init i2c: i801: Use a different adapter-name for IDF adapters PCI: Mark Creative Labs EMU20k2 INTx masking as broken media: videobuf2-core: clear memory related fields in __vb2_plane_dmabuf_put() usb: chipidea: udc: enable suspend interrupt after usb reset tools/iio: Add memory allocation failure check for trigger_name driver core: bus: Return -EIO instead of 0 when show/store invalid bus attribute fbdev: sisfb: Fix strbuf array overflow NFS: Remove print_overflow_msg() SUNRPC: Fix integer overflow in decode_rc_list() tcp: fix tcp_enter_recovery() to zero retrans_stamp when it's safe netfilter: br_netfilter: fix panic with metadata_dst skb Bluetooth: RFCOMM: FIX possible deadlock in rfcomm_sk_state_change gpio: aspeed: Add the flush write to ensure the write complete. clk: Add (devm_)clk_get_optional() functions clk: generalize devm_clk_get() a bit clk: Provide new devm_clk helpers for prepared and enabled clocks gpio: aspeed: Use devm_clk api to manage clock source igb: Do not bring the device up after non-fatal error net: ibm: emac: mal: fix wrong goto ppp: fix ppp_async_encode() illegal access net: ipv6: ensure we call ipv6_mc_down() at most once CDC-NCM: avoid overflow in sanity checking HID: plantronics: Workaround for an unexcepted opposite volume key Revert "usb: yurex: Replace snprintf() with the safer scnprintf() variant" usb: xhci: Fix problem with xhci resume from suspend usb: storage: ignore bogus device raised by JieLi BR21 USB sound chip net: Fix an unsafe loop on the list posix-clock: Fix missing timespec64 check in pc_clock_settime() arm64: probes: Remove broken LDR (literal) uprobe support arm64: probes: Fix simulate_ldr*_literal() PCI: Add function 0 DMA alias quirk for Glenfly Arise chip fat: fix uninitialized variable KVM: Fix a data race on last_boosted_vcpu in kvm_vcpu_on_spin() net: dsa: mv88e6xxx: Fix out-of-bound access s390/sclp_vt220: Convert newlines to CRLF instead of LFCR KVM: s390: Change virtual to physical address access in diag 0x258 handler x86/cpufeatures: Define X86_FEATURE_AMD_IBPB_RET drm/vmwgfx: Handle surface check failure correctly iio: dac: stm32-dac-core: add missing select REGMAP_MMIO in Kconfig iio: adc: ti-ads8688: add missing select IIO_(TRIGGERED_)BUFFER in Kconfig iio: hid-sensors: Fix an error handling path in _hid_sensor_set_report_latency() iio: light: opt3001: add missing full-scale range value Bluetooth: Remove debugfs directory on module init failure Bluetooth: btusb: Fix regression with fake CSR controllers 0a12:0001 xhci: Fix incorrect stream context type macro USB: serial: option: add support for Quectel EG916Q-GL USB: serial: option: add Telit FN920C04 MBIM compositions parport: Proper fix for array out-of-bounds access x86/apic: Always explicitly disarm TSC-deadline timer nilfs2: propagate directory read errors from nilfs_find_entry() clk: Fix pointer casting to prevent oops in devm_clk_release() clk: Fix slab-out-of-bounds error in devm_clk_release() RDMA/bnxt_re: Fix incorrect AVID type in WQE structure RDMA/cxgb4: Fix RDMA_CM_EVENT_UNREACHABLE error for iWARP RDMA/bnxt_re: Return more meaningful error drm/msm/dsi: fix 32-bit signed integer extension in pclk_rate calculation macsec: don't increment counters for an unrelated SA net: ethernet: aeroflex: fix potential memory leak in greth_start_xmit_gbit() net: systemport: fix potential memory leak in bcm_sysport_xmit() usb: typec: altmode should keep reference to parent Bluetooth: bnep: fix wild-memory-access in proto_unregister arm64:uprobe fix the uprobe SWBP_INSN in big-endian arm64: probes: Fix uprobes for big-endian kernels KVM: s390: gaccess: Refactor gpa and length calculation KVM: s390: gaccess: Refactor access address range check KVM: s390: gaccess: Cleanup access to guest pages KVM: s390: gaccess: Check if guest address is in memslot udf: fix uninit-value use in udf_get_fileshortad jfs: Fix sanity check in dbMount net/sun3_82586: fix potential memory leak in sun3_82586_send_packet() be2net: fix potential memory leak in be_xmit() net: usb: usbnet: fix name regression posix-clock: posix-clock: Fix unbalanced locking in pc_clock_settime() ALSA: hda/realtek: Update default depop procedure drm/amd: Guard against bad data for ATIF ACPI method ACPI: button: Add DMI quirk for Samsung Galaxy Book2 to fix initial lid detection issue nilfs2: fix kernel bug due to missing clearing of buffer delay flag hv_netvsc: Fix VF namespace also in synthetic NIC NETDEV_REGISTER event selinux: improve error checking in sel_write_load() arm64/uprobes: change the uprobe_opcode_t typedef to fix the sparse warning xfrm: validate new SA's prefixlen using SA family when sel.family is unset usb: dwc3: remove generic PHY calibrate() calls usb: dwc3: Add splitdisable quirk for Hisilicon Kirin Soc usb: dwc3: core: Stop processing of pending events if controller is halted cgroup: Fix potential overflow issue when checking max_depth wifi: mac80211: skip non-uploaded keys in ieee80211_iter_keys gtp: simplify error handling code in 'gtp_encap_enable()' gtp: allow -1 to be specified as file description from userspace net/sched: stop qdisc_tree_reduce_backlog on TC_H_ROOT bpf: Fix out-of-bounds write in trie_get_next_key() net: support ip generic csum processing in skb_csum_hwoffload_help net: skip offload for NETIF_F_IPV6_CSUM if ipv6 header contains extension netfilter: nft_payload: sanitize offset and length before calling skb_checksum() firmware: arm_sdei: Fix the input parameter of cpuhp_remove_state() net: amd: mvme147: Fix probe banner message misc: sgi-gru: Don't disable preemption in GRU driver usbip: tools: Fix detach_port() invalid port error path usb: phy: Fix API devm_usb_put_phy() can not release the phy xhci: Fix Link TRB DMA in command ring stopped completion event Revert "driver core: Fix uevent_show() vs driver detach race" wifi: mac80211: do not pass a stopped vif to the driver in .get_txpower wifi: ath10k: Fix memory leak in management tx wifi: iwlegacy: Clear stale interrupts before resuming device nilfs2: fix potential deadlock with newly created symlinks ocfs2: pass u64 to ocfs2_truncate_inline maybe overflow nilfs2: fix kernel bug due to missing clearing of checked flag mm: shmem: fix data-race in shmem_getattr() vt: prevent kernel-infoleak in con_font_get() Linux 4.19.323 Change-Id: I2348f834187153067ab46b3b48b8fe7da9cee1f1 Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>
This commit is contained in:
@@ -633,6 +633,7 @@ enum {
|
||||
*/
|
||||
#define EXT4_EX_NOCACHE 0x40000000
|
||||
#define EXT4_EX_FORCE_CACHE 0x20000000
|
||||
#define EXT4_EX_NOFAIL 0x10000000
|
||||
|
||||
/*
|
||||
* Flags used by ext4_free_blocks
|
||||
|
||||
@@ -290,11 +290,14 @@ ext4_force_split_extent_at(handle_t *handle, struct inode *inode,
|
||||
{
|
||||
struct ext4_ext_path *path = *ppath;
|
||||
int unwritten = ext4_ext_is_unwritten(path[path->p_depth].p_ext);
|
||||
int flags = EXT4_EX_NOCACHE | EXT4_GET_BLOCKS_PRE_IO;
|
||||
|
||||
if (nofail)
|
||||
flags |= EXT4_GET_BLOCKS_METADATA_NOFAIL | EXT4_EX_NOFAIL;
|
||||
|
||||
return ext4_split_extent_at(handle, inode, ppath, lblk, unwritten ?
|
||||
EXT4_EXT_MARK_UNWRIT1|EXT4_EXT_MARK_UNWRIT2 : 0,
|
||||
EXT4_EX_NOCACHE | EXT4_GET_BLOCKS_PRE_IO |
|
||||
(nofail ? EXT4_GET_BLOCKS_METADATA_NOFAIL:0));
|
||||
flags);
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -536,8 +539,12 @@ __read_extent_tree_block(const char *function, unsigned int line,
|
||||
{
|
||||
struct buffer_head *bh;
|
||||
int err;
|
||||
gfp_t gfp_flags = __GFP_MOVABLE | GFP_NOFS;
|
||||
|
||||
bh = sb_getblk_gfp(inode->i_sb, pblk, __GFP_MOVABLE | GFP_NOFS);
|
||||
if (flags & EXT4_EX_NOFAIL)
|
||||
gfp_flags |= __GFP_NOFAIL;
|
||||
|
||||
bh = sb_getblk_gfp(inode->i_sb, pblk, gfp_flags);
|
||||
if (unlikely(!bh))
|
||||
return ERR_PTR(-ENOMEM);
|
||||
|
||||
@@ -879,6 +886,10 @@ ext4_find_extent(struct inode *inode, ext4_lblk_t block,
|
||||
struct ext4_ext_path *path = orig_path ? *orig_path : NULL;
|
||||
short int depth, i, ppos = 0;
|
||||
int ret;
|
||||
gfp_t gfp_flags = GFP_NOFS;
|
||||
|
||||
if (flags & EXT4_EX_NOFAIL)
|
||||
gfp_flags |= __GFP_NOFAIL;
|
||||
|
||||
eh = ext_inode_hdr(inode);
|
||||
depth = ext_depth(inode);
|
||||
@@ -899,7 +910,7 @@ ext4_find_extent(struct inode *inode, ext4_lblk_t block,
|
||||
if (!path) {
|
||||
/* account possible depth increase */
|
||||
path = kcalloc(depth + 2, sizeof(struct ext4_ext_path),
|
||||
GFP_NOFS);
|
||||
gfp_flags);
|
||||
if (unlikely(!path))
|
||||
return ERR_PTR(-ENOMEM);
|
||||
path[0].p_maxdepth = depth + 1;
|
||||
@@ -945,6 +956,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:
|
||||
@@ -1049,9 +1062,13 @@ static int ext4_ext_split(handle_t *handle, struct inode *inode,
|
||||
ext4_fsblk_t newblock, oldblock;
|
||||
__le32 border;
|
||||
ext4_fsblk_t *ablocks = NULL; /* array of allocated blocks */
|
||||
gfp_t gfp_flags = GFP_NOFS;
|
||||
int err = 0;
|
||||
size_t ext_size = 0;
|
||||
|
||||
if (flags & EXT4_EX_NOFAIL)
|
||||
gfp_flags |= __GFP_NOFAIL;
|
||||
|
||||
/* make decision: where to split? */
|
||||
/* FIXME: now decision is simplest: at current extent */
|
||||
|
||||
@@ -1085,7 +1102,7 @@ static int ext4_ext_split(handle_t *handle, struct inode *inode,
|
||||
* We need this to handle errors and free blocks
|
||||
* upon them.
|
||||
*/
|
||||
ablocks = kcalloc(depth, sizeof(ext4_fsblk_t), GFP_NOFS);
|
||||
ablocks = kcalloc(depth, sizeof(ext4_fsblk_t), gfp_flags);
|
||||
if (!ablocks)
|
||||
return -ENOMEM;
|
||||
|
||||
@@ -1872,6 +1889,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);
|
||||
}
|
||||
@@ -2074,7 +2092,7 @@ int ext4_ext_insert_extent(handle_t *handle, struct inode *inode,
|
||||
if (next != EXT_MAX_BLOCKS) {
|
||||
ext_debug("next leaf block - %u\n", next);
|
||||
BUG_ON(npath != NULL);
|
||||
npath = ext4_find_extent(inode, next, NULL, 0);
|
||||
npath = ext4_find_extent(inode, next, NULL, gb_flags);
|
||||
if (IS_ERR(npath))
|
||||
return PTR_ERR(npath);
|
||||
BUG_ON(npath->p_depth != path->p_depth);
|
||||
@@ -2099,6 +2117,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;
|
||||
|
||||
@@ -2876,7 +2895,8 @@ int ext4_ext_remove_space(struct inode *inode, ext4_lblk_t start,
|
||||
ext4_fsblk_t pblk;
|
||||
|
||||
/* find extent for or closest extent to this block */
|
||||
path = ext4_find_extent(inode, end, NULL, EXT4_EX_NOCACHE);
|
||||
path = ext4_find_extent(inode, end, NULL,
|
||||
EXT4_EX_NOCACHE | EXT4_EX_NOFAIL);
|
||||
if (IS_ERR(path)) {
|
||||
ext4_journal_stop(handle);
|
||||
return PTR_ERR(path);
|
||||
@@ -2958,7 +2978,7 @@ int ext4_ext_remove_space(struct inode *inode, ext4_lblk_t start,
|
||||
le16_to_cpu(path[k].p_hdr->eh_entries)+1;
|
||||
} else {
|
||||
path = kcalloc(depth + 1, sizeof(struct ext4_ext_path),
|
||||
GFP_NOFS);
|
||||
GFP_NOFS | __GFP_NOFAIL);
|
||||
if (path == NULL) {
|
||||
ext4_journal_stop(handle);
|
||||
return -ENOMEM;
|
||||
@@ -3273,9 +3293,27 @@ static int ext4_split_extent_at(handle_t *handle,
|
||||
ext4_ext_mark_unwritten(ex2);
|
||||
|
||||
err = ext4_ext_insert_extent(handle, inode, ppath, &newex, flags);
|
||||
if (err != -ENOSPC && err != -EDQUOT)
|
||||
if (err != -ENOSPC && err != -EDQUOT && err != -ENOMEM)
|
||||
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) {
|
||||
@@ -3324,7 +3362,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;
|
||||
}
|
||||
|
||||
@@ -3380,7 +3418,7 @@ static int ext4_split_extent(handle_t *handle,
|
||||
* Update path is required because previous ext4_split_extent_at() may
|
||||
* result in split of original leaf or extent zeroout.
|
||||
*/
|
||||
path = ext4_find_extent(inode, map->m_lblk, ppath, 0);
|
||||
path = ext4_find_extent(inode, map->m_lblk, ppath, flags);
|
||||
if (IS_ERR(path))
|
||||
return PTR_ERR(path);
|
||||
depth = ext_depth(inode);
|
||||
@@ -4675,7 +4713,14 @@ int ext4_ext_truncate(handle_t *handle, struct inode *inode)
|
||||
}
|
||||
if (err)
|
||||
return err;
|
||||
return ext4_ext_remove_space(inode, last_block, EXT_MAX_BLOCKS - 1);
|
||||
retry_remove_space:
|
||||
err = ext4_ext_remove_space(inode, last_block, EXT_MAX_BLOCKS - 1);
|
||||
if (err == -ENOMEM) {
|
||||
cond_resched();
|
||||
congestion_wait(BLK_RW_ASYNC, HZ/50);
|
||||
goto retry_remove_space;
|
||||
}
|
||||
return err;
|
||||
}
|
||||
|
||||
static int ext4_alloc_file_blocks(struct file *file, ext4_lblk_t offset,
|
||||
@@ -5731,6 +5776,7 @@ int ext4_insert_range(struct inode *inode, 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;
|
||||
}
|
||||
|
||||
|
||||
@@ -510,6 +510,8 @@ static int find_group_orlov(struct super_block *sb, struct inode *parent,
|
||||
if (min_inodes < 1)
|
||||
min_inodes = 1;
|
||||
min_clusters = avefreec - EXT4_CLUSTERS_PER_GROUP(sb)*flex_size / 4;
|
||||
if (min_clusters < 0)
|
||||
min_clusters = 0;
|
||||
|
||||
/*
|
||||
* Start looking in the flex group where we last allocated an
|
||||
|
||||
@@ -1672,24 +1672,36 @@ struct buffer_head *ext4_find_inline_entry(struct inode *dir,
|
||||
struct ext4_dir_entry_2 **res_dir,
|
||||
int *has_inline_data)
|
||||
{
|
||||
struct ext4_xattr_ibody_find is = {
|
||||
.s = { .not_found = -ENODATA, },
|
||||
};
|
||||
struct ext4_xattr_info i = {
|
||||
.name_index = EXT4_XATTR_INDEX_SYSTEM,
|
||||
.name = EXT4_XATTR_SYSTEM_DATA,
|
||||
};
|
||||
int ret;
|
||||
struct ext4_iloc iloc;
|
||||
void *inline_start;
|
||||
int inline_size;
|
||||
|
||||
if (ext4_get_inode_loc(dir, &iloc))
|
||||
return NULL;
|
||||
ret = ext4_get_inode_loc(dir, &is.iloc);
|
||||
if (ret)
|
||||
return ERR_PTR(ret);
|
||||
|
||||
down_read(&EXT4_I(dir)->xattr_sem);
|
||||
|
||||
ret = ext4_xattr_ibody_find(dir, &i, &is);
|
||||
if (ret)
|
||||
goto out;
|
||||
|
||||
if (!ext4_has_inline_data(dir)) {
|
||||
*has_inline_data = 0;
|
||||
goto out;
|
||||
}
|
||||
|
||||
inline_start = (void *)ext4_raw_inode(&iloc)->i_block +
|
||||
inline_start = (void *)ext4_raw_inode(&is.iloc)->i_block +
|
||||
EXT4_INLINE_DOTDOT_SIZE;
|
||||
inline_size = EXT4_MIN_INLINE_DATA_SIZE - EXT4_INLINE_DOTDOT_SIZE;
|
||||
ret = ext4_search_dir(iloc.bh, inline_start, inline_size,
|
||||
ret = ext4_search_dir(is.iloc.bh, inline_start, inline_size,
|
||||
dir, fname, 0, res_dir);
|
||||
if (ret == 1)
|
||||
goto out_find;
|
||||
@@ -1699,20 +1711,23 @@ struct buffer_head *ext4_find_inline_entry(struct inode *dir,
|
||||
if (ext4_get_inline_size(dir) == EXT4_MIN_INLINE_DATA_SIZE)
|
||||
goto out;
|
||||
|
||||
inline_start = ext4_get_inline_xattr_pos(dir, &iloc);
|
||||
inline_start = ext4_get_inline_xattr_pos(dir, &is.iloc);
|
||||
inline_size = ext4_get_inline_size(dir) - EXT4_MIN_INLINE_DATA_SIZE;
|
||||
|
||||
ret = ext4_search_dir(iloc.bh, inline_start, inline_size,
|
||||
ret = ext4_search_dir(is.iloc.bh, inline_start, inline_size,
|
||||
dir, fname, 0, res_dir);
|
||||
if (ret == 1)
|
||||
goto out_find;
|
||||
|
||||
out:
|
||||
brelse(iloc.bh);
|
||||
iloc.bh = NULL;
|
||||
brelse(is.iloc.bh);
|
||||
if (ret < 0)
|
||||
is.iloc.bh = ERR_PTR(ret);
|
||||
else
|
||||
is.iloc.bh = NULL;
|
||||
out_find:
|
||||
up_read(&EXT4_I(dir)->xattr_sem);
|
||||
return iloc.bh;
|
||||
return is.iloc.bh;
|
||||
}
|
||||
|
||||
int ext4_delete_inline_entry(handle_t *handle,
|
||||
|
||||
@@ -5622,8 +5622,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);
|
||||
/*
|
||||
@@ -5648,12 +5649,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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2834,11 +2834,8 @@ static void ext4_free_data_in_buddy(struct super_block *sb,
|
||||
/*
|
||||
* Clear the trimmed flag for the group so that the next
|
||||
* ext4_trim_fs can trim it.
|
||||
* If the volume is mounted with -o discard, online discard
|
||||
* is supported and the free blocks will be trimmed online.
|
||||
*/
|
||||
if (!test_opt(sb, DISCARD))
|
||||
EXT4_MB_GRP_CLEAR_TRIMMED(db);
|
||||
EXT4_MB_GRP_CLEAR_TRIMMED(db);
|
||||
|
||||
if (!db->bb_free_root.rb_node) {
|
||||
/* No more items in the per group rb tree
|
||||
@@ -4962,8 +4959,9 @@ void ext4_free_blocks(handle_t *handle, struct inode *inode,
|
||||
" group:%d block:%d count:%lu failed"
|
||||
" with %d", block_group, bit, count,
|
||||
err);
|
||||
} else
|
||||
EXT4_MB_GRP_CLEAR_TRIMMED(e4b.bd_info);
|
||||
}
|
||||
|
||||
EXT4_MB_GRP_CLEAR_TRIMMED(e4b.bd_info);
|
||||
|
||||
ext4_lock_group(sb, block_group);
|
||||
mb_clear_bits(bitmap_bh->b_data, bit, count_clusters);
|
||||
|
||||
@@ -678,8 +678,8 @@ int ext4_ind_migrate(struct inode *inode)
|
||||
ei->i_data[i] = cpu_to_le32(blk++);
|
||||
ext4_mark_inode_dirty(handle, inode);
|
||||
errout:
|
||||
ext4_journal_stop(handle);
|
||||
up_write(&EXT4_I(inode)->i_data_sem);
|
||||
ext4_journal_stop(handle);
|
||||
out_unlock:
|
||||
percpu_up_write(&sbi->s_writepages_rwsem);
|
||||
return ret;
|
||||
|
||||
@@ -37,7 +37,6 @@ get_ext_path(struct inode *inode, ext4_lblk_t lblock,
|
||||
*ppath = NULL;
|
||||
return -ENODATA;
|
||||
}
|
||||
*ppath = path;
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
@@ -1493,7 +1493,7 @@ static bool ext4_match(struct inode *parent,
|
||||
}
|
||||
|
||||
/*
|
||||
* Returns 0 if not found, -1 on failure, and 1 on success
|
||||
* Returns 0 if not found, -EFSCORRUPTED on failure, and 1 on success
|
||||
*/
|
||||
int ext4_search_dir(struct buffer_head *bh, char *search_buf, int buf_size,
|
||||
struct inode *dir, struct ext4_filename *fname,
|
||||
@@ -1514,7 +1514,7 @@ int ext4_search_dir(struct buffer_head *bh, char *search_buf, int buf_size,
|
||||
* a full check */
|
||||
if (ext4_check_dir_entry(dir, NULL, de, bh, search_buf,
|
||||
buf_size, offset))
|
||||
return -1;
|
||||
return -EFSCORRUPTED;
|
||||
*res_dir = de;
|
||||
return 1;
|
||||
}
|
||||
@@ -1522,7 +1522,7 @@ int ext4_search_dir(struct buffer_head *bh, char *search_buf, int buf_size,
|
||||
de_len = ext4_rec_len_from_disk(de->rec_len,
|
||||
dir->i_sb->s_blocksize);
|
||||
if (de_len <= 0)
|
||||
return -1;
|
||||
return -EFSCORRUPTED;
|
||||
offset += de_len;
|
||||
de = (struct ext4_dir_entry_2 *) ((char *) de + de_len);
|
||||
}
|
||||
@@ -1673,8 +1673,10 @@ static struct buffer_head *__ext4_find_entry(struct inode *dir,
|
||||
goto cleanup_and_exit;
|
||||
} else {
|
||||
brelse(bh);
|
||||
if (i < 0)
|
||||
if (i < 0) {
|
||||
ret = ERR_PTR(i);
|
||||
goto cleanup_and_exit;
|
||||
}
|
||||
}
|
||||
next:
|
||||
if (++block >= nblocks)
|
||||
@@ -1769,7 +1771,7 @@ static struct buffer_head * ext4_dx_find_entry(struct inode *dir,
|
||||
if (retval == 1)
|
||||
goto success;
|
||||
brelse(bh);
|
||||
if (retval == -1) {
|
||||
if (retval < 0) {
|
||||
bh = ERR_PTR(ERR_BAD_DX_DIR);
|
||||
goto errout;
|
||||
}
|
||||
@@ -2004,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));
|
||||
|
||||
@@ -437,7 +437,7 @@ static int ext4_xattr_inode_iget(struct inode *parent, unsigned long ea_ino,
|
||||
ext4_set_inode_state(inode, EXT4_STATE_LUSTRE_EA_INODE);
|
||||
ext4_xattr_inode_set_ref(inode, 1);
|
||||
} else {
|
||||
inode_lock(inode);
|
||||
inode_lock_nested(inode, I_MUTEX_XATTR);
|
||||
inode->i_flags |= S_NOQUOTA;
|
||||
inode_unlock(inode);
|
||||
}
|
||||
@@ -1053,7 +1053,7 @@ static int ext4_xattr_inode_update_ref(handle_t *handle, struct inode *ea_inode,
|
||||
s64 ref_count;
|
||||
int ret;
|
||||
|
||||
inode_lock(ea_inode);
|
||||
inode_lock_nested(ea_inode, I_MUTEX_XATTR);
|
||||
|
||||
ret = ext4_reserve_inode_write(handle, ea_inode, &iloc);
|
||||
if (ret) {
|
||||
|
||||
Reference in New Issue
Block a user