Files
kernel_google_redbull/fs/ext4/sysfs.c
Wilson Sung 09d634c1ac Merge android-4.19-stable (4.19.278) into android-msm-pixel-4.19-lts
Merge 4.19.278 into android-4.19-stable
Linux 4.19.278
    ila: do not generate empty messages in ila_xlat_nl_cmd_get_mapping()
    nfc: fdp: add null check of devm_kmalloc_array in fdp_nci_i2c_read_device_properties
    net: caif: Fix use-after-free in cfusbl_device_notify()
    drm/i915: Don't use BAR mappings for ring buffers with LLC
  * tipc: improve function tipc_wait_for_cond()
      net/tipc/socket.c
    media: ov5640: Fix analogue gain control
  * PCI: Add SolidRun vendor ID
      include/linux/pci_ids.h
    macintosh: windfarm: Use unsigned type for 1-bit bitfields
    alpha: fix R_ALPHA_LITERAL reloc for large modules
    MIPS: Fix a compilation issue
    Revert "spi: mt7621: Fix an error message in mt7621_spi_probe()"
  * scsi: core: Remove the /proc/scsi/${proc_name} directory earlier
      drivers/scsi/hosts.c
  * kbuild: generate modules.order only in directories visited by obj-y/m
      scripts/Makefile.build
  * kbuild: fix false-positive need-builtin calculation
      scripts/Makefile.build
    udf: Detect system inodes linked into directory hierarchy
    udf: Preserve link count of system files
    udf: Remove pointless union in udf_inode_info
    udf: reduce leakage of blocks related to named streams
    udf: Explain handling of load_nls() failure
    nfc: change order inside nfc_se_io error path
  * ext4: zero i_disksize when initializing the bootloader inode
      fs/ext4/ioctl.c
  * ext4: fix WARNING in ext4_update_inline_data
      fs/ext4/xattr.c
  * ext4: move where set the MAY_INLINE_DATA flag is set
      fs/ext4/inline.c
      fs/ext4/inode.c
  * ext4: fix another off-by-one fsmap error on 1k block filesystems
      fs/ext4/fsmap.c
  * ext4: fix RENAME_WHITEOUT handling for inline directories
      fs/ext4/namei.c
    x86/CPU/AMD: Disable XSAVES on AMD family 0x17
  * fs: prevent out-of-bounds array speculation when closing a file descriptor
      fs/file.c
    Merge 4.19.277 into android-4.19-stable
Linux 4.19.277
    staging: rtl8192e: Remove call_usermodehelper starting RadioPower.sh
    staging: rtl8192e: Remove function ..dm_check_ac_dc_power calling a script
  * wifi: cfg80211: Partial revert "wifi: cfg80211: Fix use after free for wext"
      net/wireless/sme.c
    Merge 4.19.276 into android-4.19-stable
Linux 4.19.276
    thermal: intel: powerclamp: Fix cur_state for multi package system
  * f2fs: fix cgroup writeback accounting with fs-layer encryption
      fs/f2fs/data.c
    media: uvcvideo: Fix race condition with usb_kill_urb
    media: uvcvideo: Provide sync and async uvc_ctrl_status_event
  * tcp: Fix listen() regression in 4.19.270
      net/ipv4/inet_connection_sock.c
    s390/setup: init jump labels before command line parsing
    s390/maccess: add no DAT mode to kernel_write
  * Bluetooth: hci_sock: purge socket queues in the destruct() callback
      net/bluetooth/hci_sock.c
    phy: rockchip-typec: Fix unsigned comparison with less than zero
  * usb: uvc: Enumerate valid values for color matching
      include/uapi/linux/usb/video.h
    USB: ene_usb6250: Allocate enough memory for full object
    usb: host: xhci: mvebu: Iterate over array indexes instead of using pointer math
    iio: accel: mma9551_core: Prevent uninitialized variable in mma9551_read_config_word()
    iio: accel: mma9551_core: Prevent uninitialized variable in mma9551_read_status_word()
    tools/iio/iio_utils:fix memory leak
    mei: bus-fixup:upon error print return values of send and receive
    tty: serial: fsl_lpuart: disable the CTS when send break signal
  * tty: fix out-of-bounds access in tty_driver_lookup_tty()
      drivers/tty/tty_io.c
  * media: uvcvideo: Silence memcpy() run-time false positive warnings
      include/uapi/linux/uvcvideo.h
    media: uvcvideo: Handle errors from calls to usb_string
    media: uvcvideo: Handle cameras with invalid descriptors
    firmware/efi sysfb_efi: Add quirk for Lenovo IdeaPad Duet 3
  * tracing: Add NULL checks for buffer in ring_buffer_free_read_page()
      kernel/trace/ring_buffer.c
    thermal: intel: quark_dts: fix error pointer dereference
    scsi: ipr: Work around fortify-string warning
    vc_screen: modify vcs_size() handling in vcs_read()
  * tcp: tcp_check_req() can be called from process context
      net/ipv4/tcp_minisocks.c
    ARM: dts: spear320-hmi: correct STMPE GPIO compatible
    nfc: fix memory leak of se_io context in nfc_genl_se_io
    9p/rdma: unmap receive dma buffer in rdma_request()/post_recv()
    9p/xen: fix connection sequence
    9p/xen: fix version parsing
  * net: fix __dev_kfree_skb_any() vs drop monitor
      net/core/dev.c
  * netfilter: ctnetlink: fix possible refcount leak in ctnetlink_create_conntrack()
      net/netfilter/nf_conntrack_netlink.c
    watchdog: pcwd_usb: Fix attempting to access uninitialized memory
  * watchdog: Fix kmemleak in watchdog_cdev_register
      drivers/watchdog/watchdog_dev.c
    watchdog: at91sam9_wdt: use devm_request_irq to avoid missing free_irq() in error path
    x86: um: vdso: Add '%rcx' and '%r11' to the syscall clobber list
    ubi: ubi_wl_put_peb: Fix infinite loop when wear-leveling work failed
    ubi: Fix UAF wear-leveling entry in eraseblk_count_seq_show()
    ubifs: ubifs_writepage: Mark page dirty after writing inode failed
    ubifs: dirty_cow_znode: Fix memleak in error handling path
    ubifs: Re-statistic cleaned znode count if commit failed
    ubi: Fix possible null-ptr-deref in ubi_free_volume()
    ubi: Fix unreferenced object reported by kmemleak in ubi_resize_volume()
    ubi: Fix use-after-free when volume resizing failed
    ubifs: Reserve one leb for each journal head while doing budget
    ubifs: do_rename: Fix wrong space budget when target inode's nlink > 1
    ubifs: Fix wrong dirty space budget for dirty inode
    ubifs: Rectify space budget for ubifs_xrename()
    ubifs: Rectify space budget for ubifs_symlink() if symlink is encrypted
    ubi: ensure that VID header offset + VID header size <= alloc, size
    um: vector: Fix memory leak in vector_config
    pwm: stm32-lp: fix the check on arr and cmp registers update
    fs/jfs: fix shift exponent db_agl2size negative
  * net/sched: Retire tcindex classifier
      net/sched/Kconfig
      net/sched/Makefile
  * kbuild: Port silent mode detection to future gnu make.
      Makefile
    wifi: ath9k: use proper statements in conditionals
    drm/radeon: Fix eDP for single-display iMac11,2
  * PCI: Avoid FLR for AMD FCH AHCI adapters
      drivers/pci/quirks.c
    scsi: ses: Fix slab-out-of-bounds in ses_intf_remove()
    scsi: ses: Fix possible desc_ptr out-of-bounds accesses
    scsi: ses: Fix possible addl_desc_ptr out-of-bounds accesses
    scsi: ses: Fix slab-out-of-bounds in ses_enclosure_data_process()
    scsi: ses: Don't attach if enclosure has no components
    scsi: qla2xxx: Fix erroneous link down
    scsi: qla2xxx: Fix link failure in NPIV environment
    ktest.pl: Add RUN_TIMEOUT option with default unlimited
    ktest.pl: Fix missing "end_monitor" when machine check fails
    ktest.pl: Give back console on Ctrt^C on monitor
    media: ipu3-cio2: Fix PM runtime usage_count in driver unbind
    mips: fix syscall_get_nr
    alpha: fix FEN fault handling
    rbd: avoid use-after-free in do_rbd_add() when rbd_dev_create() fails
    ARM: dts: exynos: correct TMU phandle in Odroid XU
    ARM: dts: exynos: correct TMU phandle in Exynos4
    dm flakey: don't corrupt the zero page
    dm flakey: fix logic when corrupting a bio
  * wifi: cfg80211: Fix use after free for wext
      net/wireless/sme.c
    wifi: rtl8xxxu: Use a longer retry limit of 48
  * ext4: refuse to create ea block when umounted
      fs/ext4/xattr.c
  * ext4: optimize ea_inode block expansion
      fs/ext4/xattr.c
    ALSA: ice1712: Do not left ice->gpio_mutex locked in aureon_add_controls()
  * irqdomain: Drop bogus fwspec-mapping error handling
      kernel/irq/irqdomain.c
  * irqdomain: Fix disassociation race
      kernel/irq/irqdomain.c
  * irqdomain: Fix association race
      kernel/irq/irqdomain.c
  * ima: Align ima_file_mmap() parameters with mmap_file LSM hook
      include/linux/ima.h
      security/security.c
    Documentation/hw-vuln: Document the interaction between IBRS and STIBP
    x86/speculation: Allow enabling STIBP with legacy IBRS
    x86/microcode/AMD: Fix mixed steppings support
    x86/microcode/AMD: Add a @cpu parameter to the reloading functions
    x86/microcode/amd: Remove load_microcode_amd()'s bsp parameter
  * x86/kprobes: Fix arch_check_optimized_kprobe check within optimized_kprobe range
      include/linux/kprobes.h
  * x86/kprobes: Fix __recover_optprobed_insn check optimizing logic
      include/linux/kprobes.h
    x86/reboot: Disable SVM, not just VMX, when stopping CPUs
    x86/reboot: Disable virtualization in an emergency if SVM is supported
    x86/crash: Disable virt in core NMI crash handler to avoid double shootdown
    x86/virt: Force GIF=1 prior to disabling SVM (for reboot flows)
    udf: Fix file corruption when appending just after end of preallocated extent
    udf: Do not update file length for failed writes to inline files
    udf: Do not bother merging very long extents
    udf: Truncate added extents on failed expansion
    ocfs2: fix non-auto defrag path not working issue
    ocfs2: fix defrag path triggering jbd2 ASSERT
  * f2fs: fix information leak in f2fs_move_inline_dirents()
      fs/f2fs/inline.c
    fs: hfsplus: fix UAF issue in hfsplus_put_super
    hfs: fix missing hfs_bnode_get() in __hfs_bnode_create
    ARM: dts: exynos: correct HDMI phy compatible in Exynos4
    s390/kprobes: fix current_kprobe never cleared after kprobes reenter
    s390/kprobes: fix irq mask clobbering on kprobe reenter from post_handler
    s390: discard .interp section
  * rtc: pm8xxx: fix set-alarm race
      drivers/rtc/rtc-pm8xxx.c
    firmware: coreboot: framebuffer: Ignore reserved pixel color bits
    wifi: rtl8xxxu: fixing transmisison failure for rtl8192eu
    dm cache: add cond_resched() to various workqueue loops
    dm thin: add cond_resched() to various workqueue loops
    pinctrl: at91: use devm_kasprintf() to avoid potential leaks
    regulator: s5m8767: Bounds check id indexing into arrays
    regulator: max77802: Bounds check regulator id against opmode
    ASoC: kirkwood: Iterate over array indexes instead of using pointer math
    docs/scripts/gdb: add necessary make scripts_gdb step
    drm/msm/dsi: Add missing check for alloc_ordered_workqueue
    drm/radeon: free iio for atombios when driver shutdown
    drm/amd/display: Fix potential null-deref in dm_resume
    net/mlx5: fw_tracer: Fix debug print
    ACPI: video: Fix Lenovo Ideapad Z570 DMI match
    m68k: Check syscall_trace_enter() return code
    net: bcmgenet: Add a check for oversized packets
    ACPI: Don't build ACPICA with '-Os'
  * inet: fix fast path in __inet_hash_connect()
      net/ipv4/inet_hashtables.c
    wifi: brcmfmac: ensure CLM version is null-terminated to prevent stack-out-of-bounds
    x86/bugs: Reset speculation control settings on init
  * timers: Prevent union confusion from unexpected restart_syscall()
      kernel/time/hrtimer.c
      kernel/time/posix-timers.c
    thermal: intel: Fix unsigned comparison with less than zero
  * rcu: Suppress smp_processor_id() complaint in synchronize_rcu_expedited_wait()
      kernel/rcu/tree_exp.h
    wifi: brcmfmac: Fix potential stack-out-of-bounds in brcmf_c_preinit_dcmds()
    ARM: dts: exynos: Use Exynos5420 compatible for the MIPI video phy
    udf: Define EFSCORRUPTED error code
  * rpmsg: glink: Avoid infinite loop on intent for missing channel
      drivers/rpmsg/qcom_glink_native.c
    media: usb: siano: Fix use after free bugs caused by do_submit_urb
    media: i2c: ov7670: 0 instead of -EINVAL was returned
    media: rc: Fix use-after-free bugs caused by ene_tx_irqsim()
    media: i2c: ov772x: Fix memleak in ov772x_probe()
    powerpc: Remove linker flag from KBUILD_AFLAGS
    media: platform: ti: Add missing check for devm_regulator_get
    MIPS: vpe-mt: drop physical_memsize
    powerpc/rtas: ensure 4KB alignment for rtas_data_buf
    powerpc/rtas: make all exports GPL
    powerpc/pseries/lparcfg: add missing RTAS retry status handling
  * clk: Honor CLK_OPS_PARENT_ENABLE in clk_core_is_enabled()
      drivers/clk/clk.c
    powerpc/powernv/ioda: Skip unallocated resources when mapping to PE
    Input: ads7846 - don't check penirq immediately for 7845
    Input: ads7846 - don't report pressure for ads7845
    mtd: rawnand: sunxi: Fix the size of the last OOB region
    mfd: pcf50633-adc: Fix potential memleak in pcf50633_adc_async_read()
    selftests/ftrace: Fix bash specific "==" operator
    sparc: allow PM configs for sparc32 COMPILE_TEST
    perf tools: Fix auto-complete on aarch64
    perf llvm: Fix inadvertent file creation
    gfs2: jdata writepage fix
    cifs: Fix warning and UAF when destroy the MR list
    cifs: Fix lost destroy smbd connection when MR allocate failed
    nfsd: fix race to check ls_layouts
  * dm: remove flush_scheduled_work() during local_exit()
      drivers/md/dm.c
    hwmon: (mlxreg-fan) Return zero speed for broken fan
    spi: bcm63xx-hsspi: Fix multi-bit mode setting
    spi: bcm63xx-hsspi: fix pm_runtime
    scsi: aic94xx: Add missing check for dma_map_single()
    hwmon: (ltc2945) Handle error case in ltc2945_value_store
    gpio: vf610: connect GPIO label to dev name
  * ASoC: soc-compress.c: fixup private_data on snd_soc_new_compress()
      sound/soc/soc-compress.c
    drm/mediatek: Clean dangling pointer on bind error path
    drm/mediatek: Drop unbalanced obj unref
    gpu: host1x: Don't skip assigning syncpoints to channels
    drm/msm/dpu: Add check for pstates
    drm/msm: use strscpy instead of strncpy
  * drm/mipi-dsi: Fix byte order of 16-bit DCS set/get brightness
      drivers/gpu/drm/drm_mipi_dsi.c
      include/drm/drm_mipi_dsi.h
    ALSA: hda/ca0132: minor fix for allocation size
    pinctrl: rockchip: Fix refcount leak in rockchip_pinctrl_parse_groups
    pinctrl: pinctrl-rockchip: Fix a bunch of kerneldoc misdemeanours
    drm/msm/hdmi: Add missing check for alloc_ordered_workqueue
    gpu: ipu-v3: common: Add of_node_put() for reference returned by of_graph_get_port_by_id()
    drm/vc4: dpi: Fix format mapping for RGB565
    drm/vc4: dpi: Add option for inverting pixel clock and output enable
  * drm: Clarify definition of the DRM_BUS_FLAG_(PIXDATA|SYNC)_* macros
      include/drm/drm_connector.h
    drm/bridge: megachips: Fix error handling in i2c_register_driver()
  * drm: mxsfb: DRM_MXSFB should depend on ARCH_MXS || ARCH_MXC
      drivers/gpu/drm/mxsfb/Kconfig
    selftest: fib_tests: Always cleanup before exit
    irqchip/irq-bcm7120-l2: Set IRQ_LEVEL for level triggered interrupts
    irqchip/irq-brcmstb-l2: Set IRQ_LEVEL for level triggered interrupts
    can: esd_usb: Move mislocated storage of SJA1000_ECC_SEG bits in case of a bus error
    wifi: mac80211: make rate u32 in sta_set_rate_info_rx()
    crypto: crypto4xx - Call dma_unmap_page when done
    wifi: mwifiex: fix loop iterator in mwifiex_update_ampdu_txwinsize()
    wifi: iwl4965: Add missing check for create_singlethread_workqueue()
    wifi: iwl3945: Add missing check for create_singlethread_workqueue
    RISC-V: time: initialize hrtimer based broadcast clock event device
    m68k: /proc/hardware should depend on PROC_FS
  * crypto: rsa-pkcs1pad - Use akcipher_request_complete
      crypto/rsa-pkcs1pad.c
    rds: rds_rm_zerocopy_callback() correct order for list_add_tail()
    libbpf: Fix alen calculation in libbpf_nla_dump_errormsg()
  * Bluetooth: L2CAP: Fix potential user-after-free
      net/bluetooth/l2cap_core.c
      net/bluetooth/l2cap_sock.c
    irqchip/irq-mvebu-gicp: Fix refcount leak in mvebu_gicp_probe
    irqchip/alpine-msi: Fix refcount leak in alpine_msix_init_domains
    net/mlx5: Enhance debug print in page allocation failure
    powercap: fix possible name leak in powercap_register_zone()
  * crypto: seqiv - Handle EBUSY correctly
      crypto/seqiv.c
    ACPI: battery: Fix missing NUL-termination with large strings
    wifi: ath9k: Fix potential stack-out-of-bounds write in ath9k_wmi_rsp_callback()
    wifi: ath9k: hif_usb: clean up skbs if ath9k_hif_usb_rx_stream() fails
    ath9k: htc: clean up statistics macros
    ath9k: hif_usb: simplify if-if to if-else
    wifi: ath9k: htc_hst: free skb in ath9k_htc_rx_msg() if there is no callback function
    wifi: orinoco: check return value of hermes_write_wordrec()
    ACPICA: nsrepair: handle cases without a return value correctly
  * lib/mpi: Fix buffer overrun when SG is too long
      lib/mpi/mpicoder.c
  * genirq: Fix the return type of kstat_cpu_irqs_sum()
      include/linux/kernel_stat.h
    ACPICA: Drop port I/O validation for some regions
    wifi: wl3501_cs: don't call kfree_skb() under spin_lock_irqsave()
    wifi: libertas: cmdresp: don't call kfree_skb() under spin_lock_irqsave()
    wifi: libertas: main: don't call kfree_skb() under spin_lock_irqsave()
    wifi: libertas: if_usb: don't call kfree_skb() under spin_lock_irqsave()
    wifi: libertas_tf: don't call kfree_skb() under spin_lock_irqsave()
    wifi: brcmfmac: unmap dma buffer in brcmf_msgbuf_alloc_pktid()
    wifi: brcmfmac: fix potential memory leak in brcmf_netdev_start_xmit()
    wifi: ipw2200: fix memory leak in ipw_wdev_init()
    wifi: ipw2x00: don't call dev_kfree_skb() under spin_lock_irqsave()
    ipw2x00: switch from 'pci_' to 'dma_' API
    wifi: rtlwifi: Fix global-out-of-bounds bug in _rtl8812ae_phy_set_txpower_limit()
    rtlwifi: fix -Wpointer-sign warning
    wifi: rtl8xxxu: don't call dev_kfree_skb() under spin_lock_irqsave()
    wifi: libertas: fix memory leak in lbs_init_adapter()
    wifi: rsi: Fix memory leak in rsi_coex_attach()
    block: bio-integrity: Copy flags when bio_integrity_payload is cloned
  * blk-mq: remove stale comment for blk_mq_sched_mark_restart_hctx
      block/blk-mq-sched.c
    arm64: dts: mediatek: mt7622: Add missing pwm-cells to pwm node
    arm64: dts: amlogic: meson-gxl: add missing unit address to eth-phy-mux node name
    arm64: dts: amlogic: meson-gx: add missing unit address to rng node name
    arm64: dts: amlogic: meson-gx: add missing SCPI sensors compatible
    arm64: dts: amlogic: meson-axg: fix SCPI clock dvfs node name
    arm64: dts: meson-axg: enable SCPI
    arm64: dts: amlogic: meson-gx: fix SCPI clock dvfs node name
    ARM: imx: Call ida_simple_remove() for ida_simple_get
    ARM: dts: exynos: correct wr-active property in Exynos3250 Rinato
    ARM: OMAP1: call platform_device_put() in error case in omap1_dm_timer_init()
    arm64: dts: meson-gx: Fix the SCPI DVFS node name and unit address
    arm64: dts: meson-gx: Fix Ethernet MAC address unit name
    ARM: zynq: Fix refcount leak in zynq_early_slcr_init
    ARM: OMAP2+: Fix memory leak in realtime_counter_init()
    HID: asus: use spinlock to safely schedule workers
    HID: asus: use spinlock to protect concurrent accesses
    HID: asus: Remove check for same LED brightness on set
    Merge 4.19.275 into android-4.19-stable
Linux 4.19.275
  * USB: core: Don't hold device lock while reading the "descriptors" sysfs file
      drivers/usb/core/hub.c
      drivers/usb/core/sysfs.c
    USB: serial: option: add support for VW/Skoda "Carstick LTE"
    dmaengine: sh: rcar-dmac: Check for error num after dma_set_max_seg_size
    vc_screen: don't clobber return value in vcs_read
  * net: Remove WARN_ON_ONCE(sk->sk_forward_alloc) from sk_stream_kill_queues().
      net/core/stream.c
    IB/hfi1: Assign npages earlier
    btrfs: send: limit number of clones and allocated memory size
    ACPI: NFIT: fix a potential deadlock during NFIT teardown
    ARM: dts: rockchip: add power-domains property to dp node on rk3288
  * UPSTREAM: selinux: check return value of sel_make_avc_files
      security/selinux/selinuxfs.c
    UPSTREAM: lib/test_meminit: destroy cache in kmem_cache_alloc_bulk() test
    UPSTREAM: wireguard: ratelimiter: use kvcalloc() instead of kvzalloc()
    UPSTREAM: wireguard: receive: drop handshakes if queue lock is contended
    UPSTREAM: wireguard: receive: use ring buffer for incoming handshakes
  * UPSTREAM: wireguard: device: reset peer src endpoint when netns exits
      include/net/dst_cache.h
      net/core/dst_cache.c
    UPSTREAM: wireguard: selftests: actually test for routing loops
    UPSTREAM: kasan: fix tag for large allocations when using CONFIG_SLAB
  * UPSTREAM: usb: musb: select GENERIC_PHY instead of depending on it
      drivers/usb/musb/Kconfig
  * UPSTREAM: driver core: Reject pointless SYNC_STATE_ONLY device links
      drivers/base/core.c
  * BACKPORT: PM: EM: Fix inefficient states detection
      kernel/power/energy_model.c
  * UPSTREAM: cfg80211: scan: fix RCU in cfg80211_add_nontrans_list()
      net/wireless/scan.c
  * UPSTREAM: thermal/core: Fix thermal_cooling_device_register() prototype
      include/linux/thermal.h
  * UPSTREAM: PM: EM: Increase energy calculation precision
      include/linux/energy_model.h
      kernel/power/energy_model.c
    UPSTREAM: lib/test_stackinit: Fix static initializer test
    BACKPORT: userfaultfd: do not untag user pointers
    UPSTREAM: net/xfrm/compat: Copy xfrm_spdattr_type_t atributes
  * UPSTREAM: sched/uclamp: Ignore max aggregation if rq is idle
      kernel/sched/sched.h
  * UPSTREAM: net: xfrm: fix memory leak in xfrm_user_rcv_msg
      net/xfrm/xfrm_user.c
  * UPSTREAM: f2fs: Advertise encrypted casefolding in sysfs
      fs/f2fs/sysfs.c
  * UPSTREAM: fuse: ignore PG_workingset after stealing
      fs/fuse/dev.c
  * BACKPORT: loop: Fix missing discard support when using LOOP_CONFIGURE
      drivers/block/loop.c
  * BACKPORT: nvmem: core: add a missing of_node_put
      drivers/nvmem/core.c
  * UPSTREAM: usb: typec: mux: Fix copy-paste mistake in typec_mux_match
      drivers/usb/typec/mux.c
    Merge 4.19.274 into android-4.19-stable
Linux 4.19.274
  * bpf: add missing header file include
      kernel/bpf/core.c
  * ext4: Fix function prototype mismatch for ext4_feat_ktype
      fs/ext4/sysfs.c
    wifi: mwifiex: Add missing compatible string for SD8787
  * uaccess: Add speculation barrier to copy_from_user()
      include/linux/nospec.h
      kernel/bpf/core.c
      lib/usercopy.c
    mac80211: mesh: embedd mesh_paths and mpp_paths into ieee80211_if_mesh
    drm/i915/gvt: fix double free bug in split_2MB_gtt_entry
  * alarmtimer: Prevent starvation by small intervals and SIG_IGN
      kernel/time/alarmtimer.c
    powerpc: dts: t208x: Disable 10G on MAC1 and MAC2
    can: kvaser_usb: hydra: help gcc-13 to figure out cmd_len
  * random: always mix cycle counter in add_latent_entropy()
      include/linux/random.h
    powerpc: dts: t208x: Mark MAC1 and MAC2 as 10G
    wifi: rtl8xxxu: gen2: Turn on the rate control
  * BACKPORT: fscrypt: fix derivation of SipHash keys on big endian CPUs
      fs/crypto/keysetup.c
    UPSTREAM: wireguard: allowedips: free empty intermediate nodes when removing single node
    BACKPORT: wireguard: allowedips: allocate nodes in kmem_cache
    Merge "Merge 4.19.273 into android-4.19-stable" into android-4.19-stable
    Merge 4.19.273 into android-4.19-stable
Linux 4.19.273
    net: phy: meson-gxl: Add generic dummy stubs for MMD register access
    nilfs2: fix underflow in second superblock position calculations
    kvm: initialize all of the kvm_debugregs structure before sending it to userspace
    i40e: Add checking for null for nlmsg_find_attr()
  * ipv6: Fix tcp socket connection with DSCP.
      net/ipv6/tcp_ipv6.c
  * ipv6: Fix datagram socket connection with DSCP.
      net/ipv6/datagram.c
    net: mpls: fix stale pointer if allocation fails during device rename
    net: stmmac: Restrict warning on disabling DMA store and fwd mode
    bnxt_en: Fix mqprio and XDP ring checking logic
    net: stmmac: fix order of dwmac5 FlexPPS parametrization sequence
    net/usb: kalmia: Don't pass act_len in usb_bulk_msg error path
  * dccp/tcp: Avoid negative sk_forward_alloc by ipv6_pinfo.pktoptions.
      include/net/sock.h
      net/ipv6/tcp_ipv6.c
    net: bgmac: fix BCM5358 support by setting correct flags
    i40e: add double of VLAN header when computing the max MTU
    revert "squashfs: harden sanity check in squashfs_read_xattr_id_table"
  * hugetlb: check for undefined shift on 32 bit architectures
      include/linux/hugetlb.h
    ALSA: hda/realtek - fixed wrong gpio assigned
    ALSA: hda/conexant: add a new hda codec SN6180
    mmc: sdio: fix possible resource leaks in some error paths
    Revert "x86/fpu: Use _Alignof to avoid undefined behavior in TYPE_ALIGN"
    netfilter: nft_tproxy: restrict to prerouting hook
  * aio: fix mremap after fork null-deref
      fs/aio.c
    nvme-fc: fix a missing queue put in nvmet_fc_ls_create_association
    net/rose: Fix to not accept on connected socket
    tools/virtio: fix the vringh test for virtio ring changes
    ASoC: cs42l56: fix DT probe
    migrate: hugetlb: check for hugetlb shared PMD in node migration
  * bpf: Always return target ifindex in bpf_fib_lookup
      net/core/filter.c
    arm64: dts: meson-axg: Make mmc host controller interrupts level-sensitive
    arm64: dts: meson-gx: Make mmc host controller interrupts level-sensitive
    riscv: Fixup race condition on PG_dcache_clean in flush_icache_pte
    usb: typec: altmodes/displayport: Fix probe pin assign check
  * usb: core: add quirk for Alcor Link AK9563 smartcard reader
      drivers/usb/core/quirks.c
    net: USB: Fix wrong-direction WARNING in plusb.c
    pinctrl: intel: Restore the pins that used to be in Direct IRQ mode
    pinctrl: intel: Convert unsigned to unsigned int
    pinctrl: single: fix potential NULL dereference
    pinctrl: aspeed: Fix confusing types in return value
    ALSA: pci: lx6464es: fix a debug loop
    selftests: forwarding: lib: quote the sysctl values
    rds: rds_rm_zerocopy_callback() use list_first_entry()
    net: phy: meson-gxl: use MMD access dummy stubs for GXL, internal PHY
    net: phy: meson-gxl: add g12a support
  * net: phy: add macros for PHYID matching
      include/linux/phy.h
    IB/hfi1: Restore allocated resources on failed copyout
    ALSA: emux: Avoid potential array out-of-bound in snd_emux_xg_control()
    btrfs: limit device extents to the device size
    iio:adc:twl6030: Enable measurement of VAC
    thermal: intel: int340x: Add locking to int340x_thermal_get_trip_type()
    serial: 8250_dma: Fix DMA Rx rearm race
    serial: 8250_dma: Fix DMA Rx completion race
  * Squashfs: fix handling and sanity checking of xattr_ids count
      fs/squashfs/squashfs_fs.h
  * mm/swapfile: add cond_resched() in get_swap_pages()
      mm/swapfile.c
  * mm: hugetlb: proc: check for hugetlb shared PMD in /proc/PID/smaps
      fs/proc/task_mmu.c
      include/linux/hugetlb.h
    riscv: disable generation of unwind tables
    parisc: Wire up PTRACE_GETREGS/PTRACE_SETREGS for compat case
    parisc: Fix return code of pdc_iodc_print()
    iio:adc:twl6030: Enable measurements of VUSB, VBAT and others
    iio: adc: berlin2-adc: Add missing of_node_put() in error path
    iio: hid: fix the retval in accel_3d_capture_sample
    efi: Accept version 2 of memory attributes table
    watchdog: diag288_wdt: fix __diag288() inline assembly
    watchdog: diag288_wdt: do not use stack buffers for hardware data
    fbcon: Check font dimension limits
    thermal: intel: int340x: Protect trip temperature from concurrent updates
    KVM: x86/vmx: Do not skip segment attributes if unusable bit is set
    KVM: VMX: Move caching of MSR_IA32_XSS to hardware_setup()
    KVM: VMX: Move VMX specific files to a "vmx" subdirectory
    nVMX x86: Check VMX-preemption timer controls on vmentry of L2 guests
    Input: i8042 - add Clevo PCX0DX to i8042 quirk table
    Input: i8042 - add TUXEDO devices to i8042 quirk tables
    Input: i8042 - merge quirk tables
    Input: i8042 - move __initconst to fix code styling warning
    vc_screen: move load of struct vc_data pointer in vcs_read() to avoid UAF
  * usb: gadget: f_fs: Fix unbalanced spinlock in __ffs_ep0_queue_wait
      drivers/usb/gadget/function/f_fs.c
  * usb: dwc3: qcom: enable vbus override when in OTG dr-mode
      drivers/usb/dwc3/dwc3-qcom.c
  * usb: dwc3: dwc3-qcom: Fix typo in the dwc3 vbus override API
      drivers/usb/dwc3/dwc3-qcom.c
    iio: adc: stm32-dfsdm: fill module aliases
    net/x25: Fix to not accept on connected socket
    i2c: rk3x: fix a bunch of kernel-doc warnings
    scsi: iscsi_tcp: Fix UAF during login when accessing the shost ipaddress
    scsi: target: core: Fix warning on RT kernels
    net: openvswitch: fix flow memory leak in ovs_flow_cmd_new
    ata: libata: Fix sata_down_spd_limit() when no link speed is reported
    squashfs: harden sanity check in squashfs_read_xattr_id_table
    netrom: Fix use-after-free caused by accept on already connected socket
    ALSA: hda/via: Avoid potential array out-of-bound in add_secret_dac_path()
    bus: sunxi-rsb: Fix error handling in sunxi_rsb_init()
    firewire: fix memory leak for payload of request subaction to IEC 61883-1 FCP region
    UPSTREAM: wireguard: allowedips: remove nodes in O(1)
    UPSTREAM: wireguard: allowedips: initialize list head in selftest
    UPSTREAM: wireguard: use synchronize_net rather than synchronize_rcu
    UPSTREAM: wireguard: do not use -O3
    UPSTREAM: wireguard: selftests: make sure rp_filter is disabled on vethc
    BACKPORT: wireguard: selftests: remove old conntrack kconfig value
  * BACKPORT: usb: typec: mux: Fix matching with typec_altmode_desc
      drivers/usb/typec/mux.c
  * UPSTREAM: sched/uclamp: Fix locking around cpu_util_update_eff()
      kernel/sched/core.c
  * UPSTREAM: sched/uclamp: Fix wrong implementation of cpu.uclamp.min
      kernel/sched/core.c
    UPSTREAM: usb: musb: Fix an error message
    UPSTREAM: arm64: doc: Add brk/mmap/mremap() to the Tagged Address ABI Exceptions
  * BACKPORT: selinux: add proper NULL termination to the secclass_map permissions
      security/selinux/include/classmap.h
    UPSTREAM: crypto: arm/curve25519 - Move '.fpu' after '.arch'
    UPSTREAM: libnvdimm/region: Fix nvdimm_has_flush() to handle ND_REGION_ASYNC
  * UPSTREAM: of: property: fw_devlink: do not link ".*,nr-gpios"
      drivers/of/property.c
    UPSTREAM: xfrm/compat: Cleanup WARN()s that can be user-triggered
    UPSTREAM: wireguard: selftests: test multiple parallel streams
    UPSTREAM: crypto: mips: add poly1305-core.S to .gitignore
  * BACKPORT: arm64: kasan: fix page_alloc tagging with DEBUG_VIRTUAL
      arch/arm64/include/asm/memory.h
  * UPSTREAM: crypto: mips/poly1305 - enable for all MIPS processors
      crypto/Kconfig
      drivers/net/Kconfig
    UPSTREAM: kbuild: do not include include/config/auto.conf from adjust_autoksyms.sh
  * UPSTREAM: wireguard: kconfig: use arm chacha even with no neon
      drivers/net/Kconfig
    UPSTREAM: wireguard: queueing: get rid of per-peer ring buffers
    UPSTREAM: wireguard: device: do not generate ICMP for non-IP packets
    BACKPORT: mac80211_hwsim: notify wmediumd of used MAC addresses
    BACKPORT: mac80211_hwsim: add concurrent channels scanning support over virtio
  * BACKPORT: perf_event_open: switch to copy_struct_from_user()
      kernel/events/core.c
  * BACKPORT: sched_setattr: switch to copy_struct_from_user()
      kernel/sched/core.c

Bug: 274413561
Change-Id: I4334c7024c0a0b0ff52123bda3f51c09f35ebf56
Signed-off-by: JohnnLee <johnnlee@google.com>
2023-04-11 03:17:25 +00:00

470 lines
12 KiB
C

// SPDX-License-Identifier: GPL-2.0
/*
* linux/fs/ext4/sysfs.c
*
* Copyright (C) 1992, 1993, 1994, 1995
* Remy Card (card@masi.ibp.fr)
* Theodore Ts'o (tytso@mit.edu)
*
*/
#include <linux/time.h>
#include <linux/fs.h>
#include <linux/seq_file.h>
#include <linux/slab.h>
#include <linux/proc_fs.h>
#include "ext4.h"
#include "ext4_jbd2.h"
typedef enum {
attr_noop,
attr_delayed_allocation_blocks,
attr_session_write_kbytes,
attr_lifetime_write_kbytes,
attr_reserved_clusters,
attr_inode_readahead,
attr_trigger_test_error,
attr_first_error_time,
attr_last_error_time,
attr_feature,
attr_pointer_ui,
attr_pointer_atomic,
} attr_id_t;
typedef enum {
ptr_explicit,
ptr_ext4_sb_info_offset,
ptr_ext4_super_block_offset,
} attr_ptr_t;
static const char proc_dirname[] = "fs/ext4";
static struct proc_dir_entry *ext4_proc_root;
struct ext4_attr {
struct attribute attr;
short attr_id;
short attr_ptr;
union {
int offset;
void *explicit_ptr;
} u;
};
static ssize_t session_write_kbytes_show(struct ext4_sb_info *sbi, char *buf)
{
struct super_block *sb = sbi->s_buddy_cache->i_sb;
if (!sb->s_bdev->bd_part)
return snprintf(buf, PAGE_SIZE, "0\n");
return snprintf(buf, PAGE_SIZE, "%lu\n",
(part_stat_read(sb->s_bdev->bd_part,
sectors[STAT_WRITE]) -
sbi->s_sectors_written_start) >> 1);
}
static ssize_t lifetime_write_kbytes_show(struct ext4_sb_info *sbi, char *buf)
{
struct super_block *sb = sbi->s_buddy_cache->i_sb;
if (!sb->s_bdev->bd_part)
return snprintf(buf, PAGE_SIZE, "0\n");
return snprintf(buf, PAGE_SIZE, "%llu\n",
(unsigned long long)(sbi->s_kbytes_written +
((part_stat_read(sb->s_bdev->bd_part,
sectors[STAT_WRITE]) -
EXT4_SB(sb)->s_sectors_written_start) >> 1)));
}
static ssize_t inode_readahead_blks_store(struct ext4_sb_info *sbi,
const char *buf, size_t count)
{
unsigned long t;
int ret;
ret = kstrtoul(skip_spaces(buf), 0, &t);
if (ret)
return ret;
if (t && (!is_power_of_2(t) || t > 0x40000000))
return -EINVAL;
sbi->s_inode_readahead_blks = t;
return count;
}
static ssize_t reserved_clusters_store(struct ext4_sb_info *sbi,
const char *buf, size_t count)
{
unsigned long long val;
ext4_fsblk_t clusters = (ext4_blocks_count(sbi->s_es) >>
sbi->s_cluster_bits);
int ret;
ret = kstrtoull(skip_spaces(buf), 0, &val);
if (ret || val >= clusters)
return -EINVAL;
atomic64_set(&sbi->s_resv_clusters, val);
return count;
}
static ssize_t trigger_test_error(struct ext4_sb_info *sbi,
const char *buf, size_t count)
{
int len = count;
if (!capable(CAP_SYS_ADMIN))
return -EPERM;
if (len && buf[len-1] == '\n')
len--;
if (len)
ext4_error(sbi->s_sb, "%.*s", len, buf);
return count;
}
#define EXT4_ATTR(_name,_mode,_id) \
static struct ext4_attr ext4_attr_##_name = { \
.attr = {.name = __stringify(_name), .mode = _mode }, \
.attr_id = attr_##_id, \
}
#define EXT4_ATTR_FUNC(_name,_mode) EXT4_ATTR(_name,_mode,_name)
#define EXT4_ATTR_FEATURE(_name) EXT4_ATTR(_name, 0444, feature)
#define EXT4_ATTR_OFFSET(_name,_mode,_id,_struct,_elname) \
static struct ext4_attr ext4_attr_##_name = { \
.attr = {.name = __stringify(_name), .mode = _mode }, \
.attr_id = attr_##_id, \
.attr_ptr = ptr_##_struct##_offset, \
.u = { \
.offset = offsetof(struct _struct, _elname),\
}, \
}
#define EXT4_RO_ATTR_ES_UI(_name,_elname) \
EXT4_ATTR_OFFSET(_name, 0444, pointer_ui, ext4_super_block, _elname)
#define EXT4_RW_ATTR_SBI_UI(_name,_elname) \
EXT4_ATTR_OFFSET(_name, 0644, pointer_ui, ext4_sb_info, _elname)
#define EXT4_ATTR_PTR(_name,_mode,_id,_ptr) \
static struct ext4_attr ext4_attr_##_name = { \
.attr = {.name = __stringify(_name), .mode = _mode }, \
.attr_id = attr_##_id, \
.attr_ptr = ptr_explicit, \
.u = { \
.explicit_ptr = _ptr, \
}, \
}
#define ATTR_LIST(name) &ext4_attr_##name.attr
EXT4_ATTR_FUNC(delayed_allocation_blocks, 0444);
EXT4_ATTR_FUNC(session_write_kbytes, 0444);
EXT4_ATTR_FUNC(lifetime_write_kbytes, 0444);
EXT4_ATTR_FUNC(reserved_clusters, 0644);
EXT4_ATTR_OFFSET(inode_readahead_blks, 0644, inode_readahead,
ext4_sb_info, s_inode_readahead_blks);
EXT4_RW_ATTR_SBI_UI(inode_goal, s_inode_goal);
EXT4_RW_ATTR_SBI_UI(mb_stats, s_mb_stats);
EXT4_RW_ATTR_SBI_UI(mb_max_to_scan, s_mb_max_to_scan);
EXT4_RW_ATTR_SBI_UI(mb_min_to_scan, s_mb_min_to_scan);
EXT4_RW_ATTR_SBI_UI(mb_order2_req, s_mb_order2_reqs);
EXT4_RW_ATTR_SBI_UI(mb_stream_req, s_mb_stream_request);
EXT4_RW_ATTR_SBI_UI(mb_group_prealloc, s_mb_group_prealloc);
EXT4_RW_ATTR_SBI_UI(extent_max_zeroout_kb, s_extent_max_zeroout_kb);
EXT4_ATTR(trigger_fs_error, 0200, trigger_test_error);
EXT4_RW_ATTR_SBI_UI(err_ratelimit_interval_ms, s_err_ratelimit_state.interval);
EXT4_RW_ATTR_SBI_UI(err_ratelimit_burst, s_err_ratelimit_state.burst);
EXT4_RW_ATTR_SBI_UI(warning_ratelimit_interval_ms, s_warning_ratelimit_state.interval);
EXT4_RW_ATTR_SBI_UI(warning_ratelimit_burst, s_warning_ratelimit_state.burst);
EXT4_RW_ATTR_SBI_UI(msg_ratelimit_interval_ms, s_msg_ratelimit_state.interval);
EXT4_RW_ATTR_SBI_UI(msg_ratelimit_burst, s_msg_ratelimit_state.burst);
EXT4_RO_ATTR_ES_UI(errors_count, s_error_count);
EXT4_ATTR(first_error_time, 0444, first_error_time);
EXT4_ATTR(last_error_time, 0444, last_error_time);
static unsigned int old_bump_val = 128;
EXT4_ATTR_PTR(max_writeback_mb_bump, 0444, pointer_ui, &old_bump_val);
static struct attribute *ext4_attrs[] = {
ATTR_LIST(delayed_allocation_blocks),
ATTR_LIST(session_write_kbytes),
ATTR_LIST(lifetime_write_kbytes),
ATTR_LIST(reserved_clusters),
ATTR_LIST(inode_readahead_blks),
ATTR_LIST(inode_goal),
ATTR_LIST(mb_stats),
ATTR_LIST(mb_max_to_scan),
ATTR_LIST(mb_min_to_scan),
ATTR_LIST(mb_order2_req),
ATTR_LIST(mb_stream_req),
ATTR_LIST(mb_group_prealloc),
ATTR_LIST(max_writeback_mb_bump),
ATTR_LIST(extent_max_zeroout_kb),
ATTR_LIST(trigger_fs_error),
ATTR_LIST(err_ratelimit_interval_ms),
ATTR_LIST(err_ratelimit_burst),
ATTR_LIST(warning_ratelimit_interval_ms),
ATTR_LIST(warning_ratelimit_burst),
ATTR_LIST(msg_ratelimit_interval_ms),
ATTR_LIST(msg_ratelimit_burst),
ATTR_LIST(errors_count),
ATTR_LIST(first_error_time),
ATTR_LIST(last_error_time),
NULL,
};
/* Features this copy of ext4 supports */
EXT4_ATTR_FEATURE(lazy_itable_init);
EXT4_ATTR_FEATURE(batched_discard);
EXT4_ATTR_FEATURE(meta_bg_resize);
#ifdef CONFIG_FS_ENCRYPTION
EXT4_ATTR_FEATURE(encryption);
EXT4_ATTR_FEATURE(test_dummy_encryption_v2);
#endif
#ifdef CONFIG_UNICODE
EXT4_ATTR_FEATURE(casefold);
#endif
#ifdef CONFIG_FS_VERITY
EXT4_ATTR_FEATURE(verity);
#endif
EXT4_ATTR_FEATURE(metadata_csum_seed);
static struct attribute *ext4_feat_attrs[] = {
ATTR_LIST(lazy_itable_init),
ATTR_LIST(batched_discard),
ATTR_LIST(meta_bg_resize),
#ifdef CONFIG_FS_ENCRYPTION
ATTR_LIST(encryption),
ATTR_LIST(test_dummy_encryption_v2),
#endif
#ifdef CONFIG_UNICODE
ATTR_LIST(casefold),
#endif
#ifdef CONFIG_FS_VERITY
ATTR_LIST(verity),
#endif
ATTR_LIST(metadata_csum_seed),
NULL,
};
static void *calc_ptr(struct ext4_attr *a, struct ext4_sb_info *sbi)
{
switch (a->attr_ptr) {
case ptr_explicit:
return a->u.explicit_ptr;
case ptr_ext4_sb_info_offset:
return (void *) (((char *) sbi) + a->u.offset);
case ptr_ext4_super_block_offset:
return (void *) (((char *) sbi->s_es) + a->u.offset);
}
return NULL;
}
static ssize_t __print_tstamp(char *buf, __le32 lo, __u8 hi)
{
return snprintf(buf, PAGE_SIZE, "%lld",
((time64_t)hi << 32) + le32_to_cpu(lo));
}
#define print_tstamp(buf, es, tstamp) \
__print_tstamp(buf, (es)->tstamp, (es)->tstamp ## _hi)
static ssize_t ext4_attr_show(struct kobject *kobj,
struct attribute *attr, char *buf)
{
struct ext4_sb_info *sbi = container_of(kobj, struct ext4_sb_info,
s_kobj);
struct ext4_attr *a = container_of(attr, struct ext4_attr, attr);
void *ptr = calc_ptr(a, sbi);
switch (a->attr_id) {
case attr_delayed_allocation_blocks:
return snprintf(buf, PAGE_SIZE, "%llu\n",
(s64) EXT4_C2B(sbi,
percpu_counter_sum(&sbi->s_dirtyclusters_counter)));
case attr_session_write_kbytes:
return session_write_kbytes_show(sbi, buf);
case attr_lifetime_write_kbytes:
return lifetime_write_kbytes_show(sbi, buf);
case attr_reserved_clusters:
return snprintf(buf, PAGE_SIZE, "%llu\n",
(unsigned long long)
atomic64_read(&sbi->s_resv_clusters));
case attr_inode_readahead:
case attr_pointer_ui:
if (!ptr)
return 0;
if (a->attr_ptr == ptr_ext4_super_block_offset)
return snprintf(buf, PAGE_SIZE, "%u\n",
le32_to_cpup(ptr));
else
return snprintf(buf, PAGE_SIZE, "%u\n",
*((unsigned int *) ptr));
case attr_pointer_atomic:
if (!ptr)
return 0;
return snprintf(buf, PAGE_SIZE, "%d\n",
atomic_read((atomic_t *) ptr));
case attr_feature:
return snprintf(buf, PAGE_SIZE, "supported\n");
case attr_first_error_time:
return print_tstamp(buf, sbi->s_es, s_first_error_time);
case attr_last_error_time:
return print_tstamp(buf, sbi->s_es, s_last_error_time);
}
return 0;
}
static ssize_t ext4_attr_store(struct kobject *kobj,
struct attribute *attr,
const char *buf, size_t len)
{
struct ext4_sb_info *sbi = container_of(kobj, struct ext4_sb_info,
s_kobj);
struct ext4_attr *a = container_of(attr, struct ext4_attr, attr);
void *ptr = calc_ptr(a, sbi);
unsigned long t;
int ret;
switch (a->attr_id) {
case attr_reserved_clusters:
return reserved_clusters_store(sbi, buf, len);
case attr_pointer_ui:
if (!ptr)
return 0;
ret = kstrtoul(skip_spaces(buf), 0, &t);
if (ret)
return ret;
if (a->attr_ptr == ptr_ext4_super_block_offset)
*((__le32 *) ptr) = cpu_to_le32(t);
else
*((unsigned int *) ptr) = t;
return len;
case attr_inode_readahead:
return inode_readahead_blks_store(sbi, buf, len);
case attr_trigger_test_error:
return trigger_test_error(sbi, buf, len);
}
return 0;
}
static void ext4_sb_release(struct kobject *kobj)
{
struct ext4_sb_info *sbi = container_of(kobj, struct ext4_sb_info,
s_kobj);
complete(&sbi->s_kobj_unregister);
}
static void ext4_feat_release(struct kobject *kobj)
{
kfree(kobj);
}
static const struct sysfs_ops ext4_attr_ops = {
.show = ext4_attr_show,
.store = ext4_attr_store,
};
static struct kobj_type ext4_sb_ktype = {
.default_attrs = ext4_attrs,
.sysfs_ops = &ext4_attr_ops,
.release = ext4_sb_release,
};
static struct kobj_type ext4_feat_ktype = {
.default_attrs = ext4_feat_attrs,
.sysfs_ops = &ext4_attr_ops,
.release = ext4_feat_release,
};
static struct kobject *ext4_root;
static struct kobject *ext4_feat;
int ext4_register_sysfs(struct super_block *sb)
{
struct ext4_sb_info *sbi = EXT4_SB(sb);
int err;
init_completion(&sbi->s_kobj_unregister);
err = kobject_init_and_add(&sbi->s_kobj, &ext4_sb_ktype, ext4_root,
"%s", sb->s_id);
if (err) {
kobject_put(&sbi->s_kobj);
wait_for_completion(&sbi->s_kobj_unregister);
return err;
}
if (ext4_proc_root)
sbi->s_proc = proc_mkdir(sb->s_id, ext4_proc_root);
if (sbi->s_proc) {
proc_create_single_data("options", S_IRUGO, sbi->s_proc,
ext4_seq_options_show, sb);
proc_create_single_data("es_shrinker_info", S_IRUGO,
sbi->s_proc, ext4_seq_es_shrinker_info_show,
sb);
proc_create_seq_data("mb_groups", S_IRUGO, sbi->s_proc,
&ext4_mb_seq_groups_ops, sb);
}
return 0;
}
void ext4_unregister_sysfs(struct super_block *sb)
{
struct ext4_sb_info *sbi = EXT4_SB(sb);
if (sbi->s_proc)
remove_proc_subtree(sb->s_id, ext4_proc_root);
kobject_del(&sbi->s_kobj);
}
int __init ext4_init_sysfs(void)
{
int ret;
ext4_root = kobject_create_and_add("ext4", fs_kobj);
if (!ext4_root)
return -ENOMEM;
ext4_feat = kzalloc(sizeof(*ext4_feat), GFP_KERNEL);
if (!ext4_feat) {
ret = -ENOMEM;
goto root_err;
}
ret = kobject_init_and_add(ext4_feat, &ext4_feat_ktype,
ext4_root, "features");
if (ret)
goto feat_err;
ext4_proc_root = proc_mkdir(proc_dirname, NULL);
return ret;
feat_err:
kobject_put(ext4_feat);
ext4_feat = NULL;
root_err:
kobject_put(ext4_root);
ext4_root = NULL;
return ret;
}
void ext4_exit_sysfs(void)
{
kobject_put(ext4_feat);
ext4_feat = NULL;
kobject_put(ext4_root);
ext4_root = NULL;
remove_proc_entry(proc_dirname, NULL);
ext4_proc_root = NULL;
}