Files
android_kernel_xiaomi_sm8450/fs/f2fs/super.c
Greg Kroah-Hartman 18cd39b706 Merge tag 'android12-5.10.136_r00' into android12-5.10
This is the merge of the upstream LTS release of 5.10.136 into the
android12-5.10 branch.

It contains the following commits:

ee965fe12d Merge branch 'android12-5.10' into branch 'android12-5.10-lts'
b7247246f6 Merge 5.10.136 into android12-5.10-lts
6eae1503dd Linux 5.10.136
1bea03b44e x86/speculation: Add LFENCE to RSB fill sequence
509c2c9fe7 x86/speculation: Add RSB VM Exit protections
e5b556a7b2 macintosh/adb: fix oob read in do_adb_query() function
75742ffc36 Bluetooth: btusb: Add Realtek RTL8852C support ID 0x13D3:0x3586
40e2e7f1bf Bluetooth: btusb: Add Realtek RTL8852C support ID 0x13D3:0x3587
9c45bb363e Bluetooth: btusb: Add Realtek RTL8852C support ID 0x0CB8:0xC558
3a292cb181 Bluetooth: btusb: Add Realtek RTL8852C support ID 0x04C5:0x1675
1a2a2e3456 Bluetooth: btusb: Add Realtek RTL8852C support ID 0x04CA:0x4007
e81f95d030 Bluetooth: btusb: Add support of IMC Networks PID 0x3568
918ce738e2 Bluetooth: hci_bcm: Add DT compatible for CYW55572
033a4455d9 Bluetooth: hci_bcm: Add BCM4349B1 variant
50763f0ac0 selftests: KVM: Handle compiler optimizations in ucall
a56e1ccdb7 tools/kvm_stat: fix display of error when multiple processes are found
3c77292d52 crypto: arm64/poly1305 - fix a read out-of-bound
e2c63e1afd ACPI: APEI: Better fix to avoid spamming the console with old error logs
6ccff35588 ACPI: video: Shortening quirk list by identifying Clevo by board_name only
a2b472b152 ACPI: video: Force backlight native for some TongFang devices
a01a4e9f5d tun: avoid double free in tun_free_netdev
1069087e2f selftests/bpf: Check dst_port only on the client socket
042fb1c281 selftests/bpf: Extend verifier and bpf_sock tests for dst_port loads
78c8397132 ath9k_htc: fix NULL pointer dereference at ath9k_htc_tx_get_packet()
4f3b852336 ath9k_htc: fix NULL pointer dereference at ath9k_htc_rxep()
45b69848a2 x86/speculation: Make all RETbleed mitigations 64-bit only
30abcdabf2 Merge 5.10.135 into android12-5.10-lts
f6ce9a9115 Merge 5.10.134 into android12-5.10-lts
4fd9cb57a3 Linux 5.10.135
4bfc9dc608 selftests: bpf: Don't run sk_lookup in verifier tests
6d3fad2b44 bpf: Add PROG_TEST_RUN support for sk_lookup programs
6aad811b37 bpf: Consolidate shared test timing code
545fc3524c x86/bugs: Do not enable IBPB at firmware entry when IBPB is not available
14b494b7aa xfs: Enforce attr3 buffer recovery order
e5f9d4e0f8 xfs: logging the on disk inode LSN can make it go backwards
c1268acaa0 xfs: remove dead stale buf unpin handling code
c85cbb0b21 xfs: hold buffer across unpin and potential shutdown processing
d8f5bb0a09 xfs: force the log offline when log intent item recovery fails
eccacbcbfd xfs: fix log intent recovery ENOSPC shutdowns when inactivating inodes
17c8097fb0 xfs: prevent UAF in xfs_log_item_in_current_chkpt
6d3605f84e xfs: xfs_log_force_lsn isn't passed a LSN
41fbfdaba9 xfs: refactor xfs_file_fsync
aadc39fd5b docs/kernel-parameters: Update descriptions for "mitigations=" param with retbleed
c4cd52ab1e EDAC/ghes: Set the DIMM label unconditionally
c454639172 ARM: 9216/1: Fix MAX_DMA_ADDRESS overflow
e500aa9f2d mt7601u: add USB device ID for some versions of XiaoDu WiFi Dongle.
2670f76a56 page_alloc: fix invalid watermark check on a negative value
8014246694 ARM: crypto: comment out gcc warning that breaks clang builds
6f3505588d sctp: leave the err path free in sctp_stream_init to sctp_stream_free
510e5b3791 sfc: disable softirqs for ptp TX
3ec42508a6 perf symbol: Correct address for bss symbols
6807897695 virtio-net: fix the race between refill work and close
440dccd80f netfilter: nf_queue: do not allow packet truncation below transport header offset
aeb2ff9f9f sctp: fix sleep in atomic context bug in timer handlers
fad6caf9b1 i40e: Fix interface init with MSI interrupts (no MSI-X)
e4a7acd6b4 tcp: Fix data-races around sysctl_tcp_reflect_tos.
f310fb69a0 tcp: Fix a data-race around sysctl_tcp_comp_sack_nr.
d2476f2059 tcp: Fix a data-race around sysctl_tcp_comp_sack_slack_ns.
4832397891 tcp: Fix a data-race around sysctl_tcp_comp_sack_delay_ns.
530a4da37e net: macsec: fix potential resource leak in macsec_add_rxsa() and macsec_add_txsa()
6e0e0464f1 macsec: always read MACSEC_SA_ATTR_PN as a u64
2daf0a1261 macsec: limit replay window size with XPN
0755c9d05a macsec: fix error message in macsec_add_rxsa and _txsa
54c295a30f macsec: fix NULL deref in macsec_add_rxsa
034bfadc8f Documentation: fix sctp_wmem in ip-sysctl.rst
4aea33f404 tcp: Fix a data-race around sysctl_tcp_invalid_ratelimit.
c4e6029a85 tcp: Fix a data-race around sysctl_tcp_autocorking.
83edb788e6 tcp: Fix a data-race around sysctl_tcp_min_rtt_wlen.
f47e7e5b49 tcp: Fix a data-race around sysctl_tcp_min_tso_segs.
5584fe9718 net: sungem_phy: Add of_node_put() for reference returned by of_get_parent()
b399ffafff igmp: Fix data-races around sysctl_igmp_qrv.
4c1318dabe net/tls: Remove the context from the list in tls_device_down
8008e797ec ipv6/addrconf: fix a null-ptr-deref bug for ip6_ptr
a84b8b53a5 net: ping6: Fix memleak in ipv6_renew_options().
c37c7f35d7 tcp: Fix a data-race around sysctl_tcp_challenge_ack_limit.
9ffb4fdfd8 tcp: Fix a data-race around sysctl_tcp_limit_output_bytes.
3e93312583 tcp: Fix data-races around sysctl_tcp_moderate_rcvbuf.
77ac046a9a Revert "tcp: change pingpong threshold to 3"
54a73d6544 scsi: ufs: host: Hold reference returned by of_parse_phandle()
160f79561e ice: do not setup vlan for loopback VSI
9ed6f97c8d ice: check (DD | EOF) bits on Rx descriptor rather than (EOP | RS)
2b4b373271 tcp: Fix data-races around sysctl_tcp_no_ssthresh_metrics_save.
3fb21b67c0 tcp: Fix a data-race around sysctl_tcp_nometrics_save.
81c45f49e6 tcp: Fix a data-race around sysctl_tcp_frto.
312ce3901f tcp: Fix a data-race around sysctl_tcp_adv_win_scale.
3cddb7a7a5 tcp: Fix a data-race around sysctl_tcp_app_win.
f10a5f905a tcp: Fix data-races around sysctl_tcp_dsack.
7fa8999b31 watch_queue: Fix missing locking in add_watch_to_object()
45a84f04a9 watch_queue: Fix missing rcu annotation
b38a8802c5 nouveau/svm: Fix to migrate all requested pages
bd46ca4146 s390/archrandom: prevent CPACF trng invocations in interrupt context
1228934cf2 ntfs: fix use-after-free in ntfs_ucsncmp()
5528990512 Revert "ocfs2: mount shared volume without ha stack"
de5d4654ac Bluetooth: L2CAP: Fix use-after-free caused by l2cap_chan_put
a46cc20143 Merge 5.10.133 into android12-5.10-lts
3f05c6dd13 ANDROID: fix up 5.10.132 merge with the virtio_mmio.c driver
7a62a4b621 Linux 5.10.134
bb1990a300 watch-queue: remove spurious double semicolon
f7c1fc0dec net: usb: ax88179_178a needs FLAG_SEND_ZLP
08afa87f58 tty: use new tty_insert_flip_string_and_push_buffer() in pty_write()
a4bb7ef2d6 tty: extract tty_flip_buffer_commit() from tty_flip_buffer_push()
c84986d097 tty: drop tty_schedule_flip()
4d374625cc tty: the rest, stop using tty_schedule_flip()
6a81848252 tty: drivers/tty/, stop using tty_schedule_flip()
0adf21eec5 watchqueue: make sure to serialize 'wqueue->defunct' properly
c0a3a9eb26 x86/alternative: Report missing return thunk details
b7b9e5cc8b x86/amd: Use IBPB for firmware calls
14fc9233aa Bluetooth: Fix bt_skb_sendmmsg not allocating partial chunks
f44e65e6f0 Bluetooth: SCO: Fix sco_send_frame returning skb->len
a8feae8bd2 Bluetooth: Fix passing NULL to PTR_ERR
5283591c84 Bluetooth: RFCOMM: Replace use of memcpy_from_msg with bt_skb_sendmmsg
341a029cf3 Bluetooth: SCO: Replace use of memcpy_from_msg with bt_skb_sendmsg
3cce0e771f Bluetooth: Add bt_skb_sendmmsg helper
c87b2bc9d7 Bluetooth: Add bt_skb_sendmsg helper
4faf4bbc2d ALSA: memalloc: Align buffer allocations in page size
d1dc861cd6 bitfield.h: Fix "type of reg too small for mask" test
f62ffdb5e2 drm/imx/dcss: fix unused but set variable warnings
577b624689 dlm: fix pending remove if msg allocation fails
cdcd20aa2c x86/bugs: Warn when "ibrs" mitigation is selected on Enhanced IBRS parts
26d5eb3c25 sched/deadline: Fix BUG_ON condition for deboosted tasks
0c722a32f2 bpf: Make sure mac_header was set before using it
ddb3f0b688 mm/mempolicy: fix uninit-value in mpol_rebind_policy()
3616776bc5 KVM: Don't null dereference ops->destroy
684896e675 spi: bcm2835: bcm2835_spi_handle_err(): fix NULL pointer deref for non DMA transfers
0648526633 tcp: Fix data-races around sysctl_tcp_max_reordering.
805f1c7ce4 tcp: Fix a data-race around sysctl_tcp_rfc1337.
03bb3892f3 tcp: Fix a data-race around sysctl_tcp_stdurg.
daa8b5b869 tcp: Fix a data-race around sysctl_tcp_retrans_collapse.
0e3f82a03e tcp: Fix data-races around sysctl_tcp_slow_start_after_idle.
cc133e4f4b tcp: Fix a data-race around sysctl_tcp_thin_linear_timeouts.
d8781f7cd0 tcp: Fix data-races around sysctl_tcp_recovery.
11e8b013d1 tcp: Fix a data-race around sysctl_tcp_early_retrans.
ffc388f6f0 tcp: Fix data-races around sysctl knobs related to SYN option.
fcaef69c79 udp: Fix a data-race around sysctl_udp_l3mdev_accept.
9add240f76 ip: Fix data-races around sysctl_ip_prot_sock.
e045d672ba ipv4: Fix a data-race around sysctl_fib_multipath_use_neigh.
36f1d9c607 drm/imx/dcss: Add missing of_node_put() in fail path
665cbe91de be2net: Fix buffer overflow in be_get_module_eeprom
4752392855 gpio: pca953x: use the correct register address when regcache sync during init
a941e6d5ba gpio: pca953x: use the correct range when do regmap sync
928ded3fc1 gpio: pca953x: only use single read/write for No AI mode
b82de63f8f ixgbe: Add locking to prevent panic when setting sriov_numvfs to zero
6f949e5615 i40e: Fix erroneous adapter reinitialization during recovery process
c6af943249 iavf: Fix handling of dummy receive descriptors
0dc2f19d8c tcp: Fix data-races around sysctl_tcp_fastopen_blackhole_timeout.
22938534c6 tcp: Fix data-races around sysctl_tcp_fastopen.
b3ce32e33a tcp: Fix data-races around sysctl_max_syn_backlog.
b6c189aa80 tcp: Fix a data-race around sysctl_tcp_tw_reuse.
fd6f1284e3 tcp: Fix a data-race around sysctl_tcp_notsent_lowat.
768e424607 tcp: Fix data-races around some timeout sysctl knobs.
474510e174 tcp: Fix data-races around sysctl_tcp_reordering.
dc1a78a2b2 tcp: Fix data-races around sysctl_tcp_syncookies.
fc489055e7 tcp: Fix data-races around keepalive sysctl knobs.
f85119fb3f igmp: Fix data-races around sysctl_igmp_max_msf.
7d26db0053 igmp: Fix a data-race around sysctl_igmp_max_memberships.
473aad9ad5 igmp: Fix data-races around sysctl_igmp_llm_reports.
e80ff0b966 net/tls: Fix race in TLS device down flow
a3ac79f38d net: stmmac: fix dma queue left shift overflow issue
f3da643d87 i2c: cadence: Change large transfer count reset logic to be unconditional
dd7b5ba44b net: stmmac: fix unbalanced ptp clock issue in suspend/resume flow
c61aede097 tcp: Fix a data-race around sysctl_tcp_probe_interval.
d452ce36f2 tcp: Fix a data-race around sysctl_tcp_probe_threshold.
d5bece4df6 tcp: Fix a data-race around sysctl_tcp_mtu_probe_floor.
97992e8fef tcp: Fix data-races around sysctl_tcp_min_snd_mss.
514d2254c7 tcp: Fix data-races around sysctl_tcp_base_mss.
77a04845f0 tcp: Fix data-races around sysctl_tcp_mtu_probing.
d4f65615db tcp/dccp: Fix a data-race around sysctl_tcp_fwmark_accept.
0ee76fe01f ip: Fix a data-race around sysctl_fwmark_reflect.
611ba70e5a ip: Fix a data-race around sysctl_ip_autobind_reuse.
94269132d0 ip: Fix data-races around sysctl_ip_nonlocal_bind.
11038fa781 ip: Fix data-races around sysctl_ip_fwd_update_priority.
b96ed5ccb0 ip: Fix data-races around sysctl_ip_fwd_use_pmtu.
5e343e3ef4 ip: Fix data-races around sysctl_ip_no_pmtu_disc.
77836dbe35 igc: Reinstate IGC_REMOVED logic and implement it properly
fb6031203e drm/amdgpu/display: add quirk handling for stutter mode
43128b3eee perf/core: Fix data race between perf_event_set_output() and perf_mmap_close()
5694b162f2 pinctrl: ralink: Check for null return of devm_kcalloc
493ceca327 power/reset: arm-versatile: Fix refcount leak in versatile_reboot_probe
47b696dd65 xfrm: xfrm_policy: fix a possible double xfrm_pols_put() in xfrm_bundle_lookup()
3777ea39f0 serial: mvebu-uart: correctly report configured baudrate value
e744aad0c4 PCI: hv: Fix interrupt mapping for multi-MSI
522bd31d6b PCI: hv: Reuse existing IRTE allocation in compose_msi_msg()
73bf070408 PCI: hv: Fix hv_arch_irq_unmask() for multi-MSI
f1d2f1ce05 PCI: hv: Fix multi-MSI to allow more than one MSI vector
b07240ce4a Revert "m68knommu: only set CONFIG_ISA_DMA_API for ColdFire sub-arch"
4f900c37f1 net: inline rollback_registered_many()
bf2f3d1970 net: move rollback_registered_many()
672fac0a43 net: inline rollback_registered()
b1158677d4 net: move net_set_todo inside rollback_registered()
2e11856ec3 net: make sure devices go through netdev_wait_all_refs
ed6964ff47 net: make free_netdev() more lenient with unregistering devices
2686f62fa7 docs: net: explain struct net_device lifetime
7a99c7c32c xen/gntdev: Ignore failure to unmap INVALID_GRANT_HANDLE
2ee0cab11f io_uring: Use original task for req identity in io_identity_cow()
ab5050fd74 lockdown: Fix kexec lockdown bypass with ima policy
426336de35 mlxsw: spectrum_router: Fix IPv4 nexthop gateway indication
15155fa898 riscv: add as-options for modules with assembly compontents
31f3bb363a pinctrl: stm32: fix optional IRQ support to gpios
bbc03f7ab8 Revert "cgroup: Use separate src/dst nodes when preloading css_sets for migration"
0c724b692d Merge 5.10.132 into android12-5.10-lts
ccdb3f9143 Merge 5.10.131 into android12-5.10-lts
50c9c56f73 Merge 5.10.130 into android12-5.10-lts
2be16baf4d Merge 5.10.129 into android12-5.10-lts
96fb478c9d Merge 5.10.128 into android12-5.10-lts
195692d0ab Merge 5.10.127 into android12-5.10-lts
f93a6ac3d6 Merge 5.10.126 into android12-5.10-lts
36c687c707 Merge 5.10.125 into android12-5.10-lts
4e3458d6d3 Merge 5.10.124 into android12-5.10-lts
fa431a5707 Merge 5.10.123 into android12-5.10-lts
8a8eb074ed Merge 5.10.122 into android12-5.10-lts
0ced6946ac Revert "drm: fix EDID struct for old ARM OABI format"
dca272b05d Revert "mailbox: forward the hrtimer if not queued and under a lock"
a73f6da5a3 Revert "Fonts: Make font size unsigned in font_desc"
8324f66c71 Revert "parisc/stifb: Keep track of hardware path of graphics card"
26e506a63e Revert "Bluetooth: Interleave with allowlist scan"
8046f2ad50 Revert "Bluetooth: use inclusive language when filtering devices"
b41a77c33b Revert "Bluetooth: use hdev lock for accept_list and reject_list in conn req"
fe07069084 Revert "thermal/drivers/core: Use a char pointer for the cooling device name"
361d75b4c1 Revert "thermal/core: Fix memory leak in __thermal_cooling_device_register()"
090d920be9 Revert "thermal/core: fix a UAF bug in __thermal_cooling_device_register()"
2dc56158cb Revert "thermal/core: Fix memory leak in the error path"
28fd8700b4 Revert "ALSA: jack: Access input_dev under mutex"
8636671438 Revert "gpiolib: of: Introduce hook for missing gpio-ranges"
0889c70b1f Revert "pinctrl: bcm2835: implement hook for missing gpio-ranges"
eaa4878a26 Revert "ext4: fix use-after-free in ext4_rename_dir_prepare"
f004760d69 Revert "ext4: verify dir block before splitting it"
5034934536 Linux 5.10.133
2fc7f18ba2 tools headers: Remove broken definition of __LITTLE_ENDIAN
060e39b8c2 tools arch: Update arch/x86/lib/mem{cpy,set}_64.S copies used in 'perf bench mem memcpy' - again
fbf60f83e2 objtool: Fix elf_create_undef_symbol() endianness
39065d5434 kvm: fix objtool relocation warning
6849ed81a3 x86: Use -mindirect-branch-cs-prefix for RETPOLINE builds
8e2774270a um: Add missing apply_returns()
725da3e67c x86/bugs: Remove apostrophe typo
81604506c2 tools headers cpufeatures: Sync with the kernel sources
3f93b8630a tools arch x86: Sync the msr-index.h copy with the kernel sources
2ef1b06cea KVM: emulate: do not adjust size of fastop and setcc subroutines
8e31dfd630 x86/kvm: fix FASTOP_SIZE when return thunks are enabled
5779e2f0cc efi/x86: use naked RET on mixed mode call wrapper
abf88ff134 x86/speculation: Use DECLARE_PER_CPU for x86_spec_ctrl_current
ecc0d92a9f x86/asm/32: Fix ANNOTATE_UNRET_SAFE use on 32-bit
95d89ec7db x86/ftrace: Add UNWIND_HINT_FUNC annotation for ftrace_stub
668cb1ddf0 x86/xen: Fix initialisation in hypercall_page after rethunk
81f20e5000 x86, kvm: use proper ASM macros for kvm_vcpu_is_preempted
844947eee3 tools/insn: Restore the relative include paths for cross building
c035ca88b0 x86/static_call: Serialize __static_call_fixup() properly
eb38964b6f x86/speculation: Disable RRSBA behavior
c2ca992144 x86/kexec: Disable RET on kexec
51552b6b52 x86/bugs: Do not enable IBPB-on-entry when IBPB is not supported
609336351d x86/bugs: Add Cannon lake to RETBleed affected CPU list
b24fdd0f1c x86/retbleed: Add fine grained Kconfig knobs
f7851ed697 x86/cpu/amd: Enumerate BTC_NO
a74f5d23e6 x86/common: Stamp out the stepping madness
4d7f72b6e1 x86/speculation: Fill RSB on vmexit for IBRS
47ae76fb27 KVM: VMX: Fix IBRS handling after vmexit
5269be9111 KVM: VMX: Prevent guest RSB poisoning attacks with eIBRS
84061fff2a KVM: VMX: Convert launched argument to flags
07401c2311 KVM: VMX: Flatten __vmx_vcpu_run()
df93717a32 objtool: Re-add UNWIND_HINT_{SAVE_RESTORE}
1dbefa5772 x86/speculation: Remove x86_spec_ctrl_mask
ce11f91b21 x86/speculation: Use cached host SPEC_CTRL value for guest entry/exit
aad83db22e x86/speculation: Fix SPEC_CTRL write on SMT state change
d29c07912a x86/speculation: Fix firmware entry SPEC_CTRL handling
f1b01ace81 x86/speculation: Fix RSB filling with CONFIG_RETPOLINE=n
ea1aa926f4 x86/cpu/amd: Add Spectral Chicken
0d1a8a16e6 objtool: Add entry UNRET validation
fbab1c94eb x86/bugs: Do IBPB fallback check only once
c8845b8754 x86/bugs: Add retbleed=ibpb
f728eff263 x86/xen: Rename SYS* entry points
28aa3fa0b2 objtool: Update Retpoline validation
55bba093fd intel_idle: Disable IBRS during long idle
e8142e2d6c x86/bugs: Report Intel retbleed vulnerability
a0f8ef71d7 x86/bugs: Split spectre_v2_select_mitigation() and spectre_v2_user_select_mitigation()
dabc2a1b40 x86/speculation: Add spectre_v2=ibrs option to support Kernel IBRS
6d7e13ccc4 x86/bugs: Optimize SPEC_CTRL MSR writes
3dddacf8c3 x86/entry: Add kernel IBRS implementation
9e727e0d94 x86/bugs: Keep a per-CPU IA32_SPEC_CTRL value
a989e75136 x86/bugs: Enable STIBP for JMP2RET
3f29791d56 x86/bugs: Add AMD retbleed= boot parameter
876750cca4 x86/bugs: Report AMD retbleed vulnerability
df748593c5 x86: Add magic AMD return-thunk
c70d6f8214 objtool: Treat .text.__x86.* as noinstr
c9eb5dcdc8 x86: Use return-thunk in asm code
5b2edaf709 x86/sev: Avoid using __x86_return_thunk
d6eb50e9b7 x86/vsyscall_emu/64: Don't use RET in vsyscall emulation
ee4996f07d x86/kvm: Fix SETcc emulation for return thunks
e0e06a9227 x86/bpf: Use alternative RET encoding
00b136bb62 x86/ftrace: Use alternative RET encoding
7723edf5ed x86,static_call: Use alternative RET encoding
446eb6f089 objtool: skip non-text sections when adding return-thunk sites
8bdb25f7ae x86,objtool: Create .return_sites
716410960b x86: Undo return-thunk damage
270de63cf4 x86/retpoline: Use -mfunction-return
37b9bb0941 Makefile: Set retpoline cflags based on CONFIG_CC_IS_{CLANG,GCC}
3e519ed8d5 x86/retpoline: Swizzle retpoline thunk
6a2b142886 x86/retpoline: Cleanup some #ifdefery
feec5277d5 x86/cpufeatures: Move RETPOLINE flags to word 11
7070bbb66c x86/kvm/vmx: Make noinstr clean
accb8cfd50 x86/realmode: build with -D__DISABLE_EXPORTS
236b959da9 objtool: Fix objtool regression on x32 systems
148811a842 x86/entry: Remove skip_r11rcx
e1db6c8a69 objtool: Fix symbol creation
3e8afd072d objtool: Fix type of reloc::addend
42ec4d7135 objtool: Fix code relocs vs weak symbols
831d5c07b7 objtool: Fix SLS validation for kcov tail-call replacement
9728af8857 crypto: x86/poly1305 - Fixup SLS
03c5c33e04 objtool: Default ignore INT3 for unreachable
bef21f88b4 kvm/emulate: Fix SETcc emulation function offsets with SLS
494ed76c14 tools arch: Update arch/x86/lib/mem{cpy,set}_64.S copies used in 'perf bench mem memcpy'
e9925a4584 x86: Add straight-line-speculation mitigation
0f8532c283 objtool: Add straight-line-speculation validation
1f6e6683c4 x86/alternative: Relax text_poke_bp() constraint
277f4ddc36 x86: Prepare inline-asm for straight-line-speculation
3c91e22576 x86: Prepare asm files for straight-line-speculation
a512fcd881 x86/lib/atomic64_386_32: Rename things
c2746d567d bpf,x86: Respect X86_FEATURE_RETPOLINE*
1713e5c4f8 bpf,x86: Simplify computing label offsets
38a80a3ca2 x86/alternative: Add debug prints to apply_retpolines()
3d13ee0d41 x86/alternative: Try inline spectre_v2=retpoline,amd
b0e2dc9506 x86/alternative: Handle Jcc __x86_indirect_thunk_\reg
381fd04c97 x86/alternative: Implement .retpoline_sites support
6eb95718f3 x86/retpoline: Create a retpoline thunk array
0de47ad5b9 x86/retpoline: Move the retpoline thunk declarations to nospec-branch.h
41ef958070 x86/asm: Fixup odd GEN-for-each-reg.h usage
8ef808b3f4 x86/asm: Fix register order
ccb8fc65a3 x86/retpoline: Remove unused replacement symbols
908bd980a8 objtool,x86: Replace alternatives with .retpoline_sites
023e78bbf1 objtool: Explicitly avoid self modifying code in .altinstr_replacement
6e4676f438 objtool: Classify symbols
acc0be56b4 objtool: Handle __sanitize_cov*() tail calls
9d7ec2418a objtool: Introduce CFI hash
e8b1128fb0 objtool: Make .altinstructions section entry size consistent
1afa44480b objtool: Remove reloc symbol type checks in get_alt_entry()
e7118a25a8 objtool: print out the symbol type when complaining about it
7ea0731957 objtool: Teach get_alt_entry() about more relocation types
364e463097 objtool: Don't make .altinstructions writable
f231b2ee85 objtool/x86: Ignore __x86_indirect_alt_* symbols
e32542e9ed objtool: Only rewrite unconditional retpoline thunk calls
a031925382 objtool: Fix .symtab_shndx handling for elf_create_undef_symbol()
76474a9dd3 x86/alternative: Optimize single-byte NOPs at an arbitrary position
f3fe1b141d objtool: Support asm jump tables
0b2c8bf498 objtool/x86: Rewrite retpoline thunk calls
ed7783dca5 objtool: Skip magical retpoline .altinstr_replacement
e87c18c4a9 objtool: Cache instruction relocs
33092b4866 objtool: Keep track of retpoline call sites
8a6d73f7db objtool: Add elf_create_undef_symbol()
b69e1b4b68 objtool: Extract elf_symbol_add()
da962cd0a2 objtool: Extract elf_strtab_concat()
b37c439250 objtool: Create reloc sections implicitly
fcdb7926d3 objtool: Add elf_create_reloc() helper
c9049cf480 objtool: Rework the elf_rebuild_reloc_section() logic
d42fa5bf19 objtool: Handle per arch retpoline naming
6e95f8caff objtool: Correctly handle retpoline thunk calls
28ca351296 x86/retpoline: Simplify retpolines
e68db6f780 x86/alternatives: Optimize optimize_nops()
9a6471666b x86: Add insn_decode_kernel()
d9cd219114 x86/alternative: Use insn_decode()
e6f8dc86a1 x86/insn-eval: Handle return values from the decoder
6bc6875b82 x86/insn: Add an insn_decode() API
76c513c87f x86/insn: Add a __ignore_sync_check__ marker
a3d96c7439 x86/insn: Rename insn_decode() to insn_decode_from_regs()
fd80da64cf x86/alternative: Use ALTERNATIVE_TERNARY() in _static_cpu_has()
341e6178c1 x86/alternative: Support ALTERNATIVE_TERNARY
0c4c698569 x86/alternative: Support not-feature
c9cf908b89 x86/alternative: Merge include files
5f93d900b9 x86/xen: Support objtool vmlinux.o validation in xen-head.S
b626e17c11 x86/xen: Support objtool validation in xen-asm.S
3116dee270 objtool: Combine UNWIND_HINT_RET_OFFSET and UNWIND_HINT_FUNC
53e89bc78e objtool: Assume only ELF functions do sibling calls
3e674f2652 objtool: Support retpoline jump detection for vmlinux.o
917a4f6348 objtool: Support stack layout changes in alternatives
e9197d768f objtool: Add 'alt_group' struct
1d516bd72a objtool: Refactor ORC section generation
dd87aa5f61 KVM/nVMX: Use __vmx_vcpu_run in nested_vmx_check_vmentry_hw
0ca2ba6e4d KVM/VMX: Use TEST %REG,%REG instead of CMP $0,%REG in vmenter.S
0e8e989142 Merge 5.10.121 into android12-5.10-lts
2de0a17df4 Merge 5.10.120 into android12-5.10-lts
7748091a31 Linux 5.10.132
06a5dc3911 x86/pat: Fix x86_has_pat_wp()
d9cb6fabc9 serial: 8250: Fix PM usage_count for console handover
e1bd94dd9e serial: pl011: UPSTAT_AUTORTS requires .throttle/unthrottle
b8c4661126 serial: stm32: Clear prev values before setting RTS delays
039ffe436a serial: 8250: fix return error code in serial8250_request_std_resource()
bfee93c9a6 vt: fix memory overlapping when deleting chars in the buffer
5450430199 tty: serial: samsung_tty: set dma burst_size to 1
0e5668ed7b usb: dwc3: gadget: Fix event pending check
f1e01a42dc usb: typec: add missing uevent when partner support PD
61ab5d644e USB: serial: ftdi_sio: add Belimo device ids
58b94325ee signal handling: don't use BUG_ON() for debugging
e75f692b79 nvme-pci: phison e16 has bogus namespace ids
54bf0b8c75 Revert "can: xilinx_can: Limit CANFD brp to 2"
35ce2c64e5 ARM: dts: stm32: use the correct clock source for CEC on stm32mp151
227ee155ea soc: ixp4xx/npe: Fix unused match warning
136d7987fc x86: Clear .brk area at early boot
fd830d8dd5 irqchip: or1k-pic: Undefine mask_ack for level triggered hardware
dae43b3792 ASoC: madera: Fix event generation for rate controls
cae4b78f3c ASoC: madera: Fix event generation for OUT1 demux
a7634527cb ASoC: cs47l15: Fix event generation for low power mux control
41f97b0ecf ASoC: dapm: Initialise kcontrol data for mux/demux controls
11a14e4f31 ASoC: wm5110: Fix DRE control
6cbbe59fdc ASoC: SOF: Intel: hda-loader: Clarify the cl_dsp_init() flow
ef1e38532f pinctrl: aspeed: Fix potential NULL dereference in aspeed_pinmux_set_mux()
13fb9105cf ASoC: ops: Fix off by one in range control validation
67dc32542a net: sfp: fix memory leak in sfp_probe()
104594de27 nvme: fix regression when disconnect a recovering ctrl
5504e63832 nvme-tcp: always fail a request when sending it failed
de876f36f9 NFC: nxp-nci: don't print header length mismatch on i2c error
efa78f2ae3 net: tipc: fix possible refcount leak in tipc_sk_create()
bacfef0bf2 platform/x86: hp-wmi: Ignore Sanitization Mode event
3ea9dbf7c2 cpufreq: pmac32-cpufreq: Fix refcount leak bug
24cd0b9bfd scsi: hisi_sas: Limit max hw sectors for v3 HW
c458ebd659 netfilter: br_netfilter: do not skip all hooks with 0 priority
93135dca8c virtio_mmio: Restore guest page size on resume
d611580032 virtio_mmio: Add missing PM calls to freeze/restore
31e16a5e11 mm: sysctl: fix missing numa_stat when !CONFIG_HUGETLB_PAGE
c713de1d80 net/tls: Check for errors in tls_device_init
eb58fd350a KVM: x86: Fully initialize 'struct kvm_lapic_irq' in kvm_pv_kick_cpu_op()
c2978d0124 net: atlantic: remove aq_nic_deinit() when resume
38e081ee06 net: atlantic: remove deep parameter on suspend/resume functions
b82e4ad58a sfc: fix kernel panic when creating VF
2d4efc9a0e seg6: bpf: fix skb checksum in bpf_push_seg6_encap()
7b38df59a8 seg6: fix skb checksum in SRv6 End.B6 and End.B6.Encaps behaviors
834fa0a22f seg6: fix skb checksum evaluation in SRH encapsulation/insertion
c224050081 sfc: fix use after free when disabling sriov
c1d9702ceb ima: Fix potential memory leak in ima_init_crypto()
eb360267e1 ima: force signature verification when CONFIG_KEXEC_SIG is configured
29c6a632f8 net: ftgmac100: Hold reference returned by of_get_child_by_name()
a51040d4b1 nexthop: Fix data-races around nexthop_compat_mode.
2c56958de8 ipv4: Fix data-races around sysctl_ip_dynaddr.
038a87b3e4 raw: Fix a data-race around sysctl_raw_l3mdev_accept.
38d78c7b4b icmp: Fix a data-race around sysctl_icmp_ratemask.
4ebf261532 icmp: Fix a data-race around sysctl_icmp_ratelimit.
b8871d9186 sysctl: Fix data-races in proc_dointvec_ms_jiffies().
2744e302e7 drm/i915/gt: Serialize TLB invalidates with GT resets
636e5dbaf0 drm/i915/selftests: fix a couple IS_ERR() vs NULL tests
359f2bca79 ARM: dts: sunxi: Fix SPI NOR campatible on Orange Pi Zero
e1aa73454a ARM: dts: at91: sama5d2: Fix typo in i2s1 node
418b191d5f ipv4: Fix a data-race around sysctl_fib_sync_mem.
e088ceb73c icmp: Fix data-races around sysctl.
fe2a35fa2c cipso: Fix data-races around sysctl.
f5811b8df2 net: Fix data-races around sysctl_mem.
d54b6ef53c inetpeer: Fix data-races around sysctl.
6481a8a72a tcp: Fix a data-race around sysctl_tcp_max_orphans.
609ce7ff75 sysctl: Fix data races in proc_dointvec_jiffies().
a5ee448d38 sysctl: Fix data races in proc_doulongvec_minmax().
e3a2144b3b sysctl: Fix data races in proc_douintvec_minmax().
71ddde27c2 sysctl: Fix data races in proc_dointvec_minmax().
d5d54714e3 sysctl: Fix data races in proc_douintvec().
80cc28a4b4 sysctl: Fix data races in proc_dointvec().
9cc8edc571 net: stmmac: dwc-qos: Disable split header for Tegra194
cd201332cc ASoC: Intel: Skylake: Correct the handling of fmt_config flexible array
fbb87a0ed2 ASoC: Intel: Skylake: Correct the ssp rate discovery in skl_get_ssp_clks()
bb8bf80387 ASoC: tas2764: Fix amp gain register offset & default
f1cd988de4 ASoC: tas2764: Correct playback volume range
52d1b4250c ASoC: tas2764: Fix and extend FSYNC polarity handling
249fe2d20d ASoC: tas2764: Add post reset delays
f160a1f970 ASoC: sgtl5000: Fix noise on shutdown/remove
831e190175 ima: Fix a potential integer overflow in ima_appraise_measurement
592f3bad00 drm/i915: fix a possible refcount leak in intel_dp_add_mst_connector()
4cb5c1950b net/mlx5e: Fix capability check for updating vnic env counters
6eb1d0c370 net/mlx5e: kTLS, Fix build time constant test in RX
c87d5211be net/mlx5e: kTLS, Fix build time constant test in TX
d6cab2e06c ARM: 9210/1: Mark the FDT_FIXED sections as shareable
3d82fba7d3 ARM: 9209/1: Spectre-BHB: avoid pr_info() every time a CPU comes out of idle
0c300e294d spi: amd: Limit max transfer and message size
d8d42c92fe ARM: dts: imx6qdl-ts7970: Fix ngpio typo and count
91f90b571f ext4: fix race condition between ext4_write and ext4_convert_inline_data
9d883b3f00 Revert "evm: Fix memleak in init_desc"
41007669fc sh: convert nommu io{re,un}map() to static inline functions
ea4dbcfb95 nilfs2: fix incorrect masking of permission flags for symlinks
14e63942d6 fs/remap: constrain dedupe of EOF blocks
0581613df7 drm/panfrost: Fix shrinker list corruption by madvise IOCTL
2e760fe05d drm/panfrost: Put mapping instead of shmem obj on panfrost_mmu_map_fault_addr() error
c1ea39a77c btrfs: return -EAGAIN for NOWAIT dio reads/writes on compressed and inline extents
7657e39585 cgroup: Use separate src/dst nodes when preloading css_sets for migration
e013ea2a51 wifi: mac80211: fix queue selection for mesh/OCB interfaces
db6e8c3015 ARM: 9214/1: alignment: advance IT state after emulating Thumb instruction
f851e4f402 ARM: 9213/1: Print message about disabled Spectre workarounds only once
fa40bb3a5f ip: fix dflt addr selection for connected nexthop
4d3e0fb05e net: sock: tracing: Fix sock_exceed_buf_limit not to dereference stale pointer
78a1400c42 tracing/histograms: Fix memory leak problem
931dbcc2e0 mm: split huge PUD on wp_huge_pud fallback
91530f675e fix race between exit_itimers() and /proc/pid/timers
b9c32a6886 xen/netback: avoid entering xenvif_rx_next_skb() with an empty rx queue
782a6b07b1 ALSA: hda/realtek - Enable the headset-mic on a Xiaomi's laptop
cacac3e13a ALSA: hda/realtek - Fix headset mic problem for a HP machine with alc221
08ab39027a ALSA: hda/realtek - Fix headset mic problem for a HP machine with alc671
4d0d15d184 ALSA: hda/realtek: Fix headset mic for Acer SF313-51
b642a3476a ALSA: hda/conexant: Apply quirk for another HP ProDesk 600 G3 model
4486bbe928 ALSA: hda - Add fixup for Dell Latitidue E5430
8f95261a00 Linux 5.10.131
cc5ee0e0ee Revert "mtd: rawnand: gpmi: Fix setting busy timeout setting"
ebc9fb07d2 ANDROID: random: fix CRC issues with the merge
e61ebc6383 ANDROID: change function signatures for some random functions.
830f0202d7 ANDROID: cpu/hotplug: avoid breaking Android ABI by fusing cpuhp steps
fee299e72e ANDROID: random: add back removed callback functions
6cc2db3cde UPSTREAM: Revert "net: af_key: add check for pfkey_broadcast in function pfkey_process"
05982f0cbb UPSTREAM: lib/crypto: add prompts back to crypto libraries
f2eb31a498 Merge 5.10.119 into android12-5.10-lts
26ae9c3614 Linux 5.10.130
8365b151fd dmaengine: ti: Add missing put_device in ti_dra7_xbar_route_allocate
37147e22cd dmaengine: ti: Fix refcount leak in ti_dra7_xbar_route_allocate
1be247db20 dmaengine: at_xdma: handle errors of at_xdmac_alloc_desc() correctly
7b721f5aec dmaengine: pl330: Fix lockdep warning about non-static key
e23cfb3fdc ida: don't use BUG_ON() for debugging
37995f034f dt-bindings: dma: allwinner,sun50i-a64-dma: Fix min/max typo
ca4a919584 misc: rtsx_usb: set return value in rsp_buf alloc err path
ff79e0ca2b misc: rtsx_usb: use separate command and response buffers
af7d9d4abe misc: rtsx_usb: fix use of dma mapped buffer for usb bulk transfer
86884017bb dmaengine: imx-sdma: Allow imx8m for imx7 FW revs
9b329edd77 i2c: cadence: Unregister the clk notifier in error path
26938bd28c r8169: fix accessing unset transport header
904f622ec7 selftests: forwarding: fix error message in learning_test
9906c22340 selftests: forwarding: fix learning_test when h1 supports IFF_UNICAST_FLT
859b889029 selftests: forwarding: fix flood_unicast_test when h2 supports IFF_UNICAST_FLT
23cdc57d88 ibmvnic: Properly dispose of all skbs during a failover.
2b4659c145 i40e: Fix dropped jumbo frames statistics
5561bddd05 xsk: Clear page contiguity bit when unmapping pool
87d2bb8882 ARM: dts: at91: sama5d2_icp: fix eeprom compatibles
9b7d8e28b6 ARM: dts: at91: sam9x60ek: fix eeprom compatible and size
ade03e5ea7 ARM: at91: pm: use proper compatibles for sam9x60's rtc and rtt
b40ac801cb ARM: at91: pm: use proper compatible for sama5d2's rtc
4c3e73a66a arm64: dts: qcom: msm8992-*: Fix vdd_lvs1_2-supply typo
1d0c3ced2d pinctrl: sunxi: sunxi_pconf_set: use correct offset
e1cda2a03d arm64: dts: imx8mp-evk: correct I2C3 pad settings
2ade1b1d92 arm64: dts: imx8mp-evk: correct gpio-led pad settings
17b3883ba5 arm64: dts: imx8mp-evk: correct the uart2 pinctl value
43319ee6a0 arm64: dts: imx8mp-evk: correct mmc pad settings
6bf74a1e74 arm64: dts: qcom: msm8994: Fix CPU6/7 reg values
2c0d10ce00 pinctrl: sunxi: a83t: Fix NAND function name for some pins
3d90607e7e ARM: meson: Fix refcount leak in meson_smp_prepare_cpus
e14930e9f9 xfs: remove incorrect ASSERT in xfs_rename
852952ea0e can: kvaser_usb: kvaser_usb_leaf: fix bittiming limits
a741e762e1 can: kvaser_usb: kvaser_usb_leaf: fix CAN clock frequency regression
f439d08ef1 can: kvaser_usb: replace run-time checks with struct kvaser_usb_driver_info
79af7be44c powerpc/powernv: delay rng platform device creation until later in boot
19104425c9 video: of_display_timing.h: include errno.h
96fa24eb1a memregion: Fix memregion_free() fallback definition
d6931bff1c PM: runtime: Redefine pm_runtime_release_supplier()
cecb806c76 fbcon: Prevent that screen size is smaller than font size
b727561ddc fbcon: Disallow setting font bigger than screen size
b81212828a fbmem: Check virtual screen sizes in fb_set_var()
d03e8ed72d fbdev: fbmem: Fix logo center image dx issue
963c80f070 iommu/vt-d: Fix PCI bus rescan device hot add
0a5e36dbcb netfilter: nf_tables: stricter validation of element data
4a6430b99f netfilter: nft_set_pipapo: release elements in clone from abort path
4f59d12efe net: rose: fix UAF bug caused by rose_t0timer_expiry
0085da9df3 usbnet: fix memory leak in error case
e917be1f83 bpf: Fix insufficient bounds propagation from adjust_scalar_min_max_vals
9adec73349 bpf: Fix incorrect verifier simulation around jmp32's jeq/jne
d0b8e22399 can: gs_usb: gs_usb_open/close(): fix memory leak
b6f4b347a1 can: grcan: grcan_probe(): remove extra of_node_get()
85cd41070d can: bcm: use call_rcu() instead of costly synchronize_rcu()
b75d4bec85 ALSA: hda/realtek: Add quirk for Clevo L140PU
6c32496964 mm/slub: add missing TID updates on slab deactivation
7208d1236f Linux 5.10.129
0e21ef1801 clocksource/drivers/ixp4xx: remove EXPORT_SYMBOL_GPL from ixp4xx_timer_setup()
7055e34462 net: usb: qmi_wwan: add Telit 0x1070 composition
f1a53bb27f net: usb: qmi_wwan: add Telit 0x1060 composition
43c8d33ce3 xen/arm: Fix race in RB-tree based P2M accounting
547b7c640d xen-netfront: restore __skb_queue_tail() positioning in xennet_get_responses()
cbbd2d2531 xen/blkfront: force data bouncing when backend is untrusted
4923217af5 xen/netfront: force data bouncing when backend is untrusted
728d68bfe6 xen/netfront: fix leaking data in shared pages
cfea428030 xen/blkfront: fix leaking data in shared pages
d341e5a754 selftests/rseq: Change type of rseq_offset to ptrdiff_t
7e617278bf selftests/rseq: x86-32: use %gs segment selector for accessing rseq thread area
27f6361cb4 selftests/rseq: x86-64: use %fs segment selector for accessing rseq thread area
a4312e2d81 selftests/rseq: Fix: work-around asm goto compiler bugs
7e1a0a9a44 selftests/rseq: Remove arm/mips asm goto compiler work-around
ba4d79af71 selftests/rseq: Fix warnings about #if checks of undefined tokens
35c6f5047f selftests/rseq: Fix ppc32 offsets by using long rather than off_t
dbc1f0ee60 selftests/rseq: Fix ppc32 missing instruction selection "u" and "x" for load/store
d4f631ea2d selftests/rseq: Fix ppc32: wrong rseq_cs 32-bit field pointer on big endian
e85fdae4df selftests/rseq: Uplift rseq selftests for compatibility with glibc-2.35
c79e564535 selftests/rseq: Introduce thread pointer getters
4a78bf83e2 selftests/rseq: Introduce rseq_get_abi() helper
3c2a416c80 selftests/rseq: Remove volatile from __rseq_abi
68e1232c6e selftests/rseq: Remove useless assignment to cpu variable
3e77ed4f90 selftests/rseq: introduce own copy of rseq uapi header
54cd556487 selftests/rseq: remove ARRAY_SIZE define from individual tests
14894cf692 hwmon: (ibmaem) don't call platform_device_del() if platform_device_add() fails
f72d410dbf ipv6/sit: fix ipip6_tunnel_get_prl return value
25055da22a sit: use min
652fd40eb0 drivers: cpufreq: Add missing of_node_put() in qoriq-cpufreq.c
79963021fd xen/gntdev: Avoid blocking in unmap_grant_pages()
5f614f5f70 tcp: add a missing nf_reset_ct() in 3WHS handling
9203dfb3ed xfs: fix xfs_reflink_unshare usage of filemap_write_and_wait_range
f874e16870 xfs: update superblock counters correctly for !lazysbcount
7ab7458d7a xfs: fix xfs_trans slab cache name
f12968a5a4 xfs: ensure xfs_errortag_random_default matches XFS_ERRTAG_MAX
da61388f9a xfs: Skip repetitive warnings about mount options
6b7dab812c xfs: rename variable mp to parsing_mp
b261cd005a xfs: use current->journal_info for detecting transaction recursion
c36d41b65e net: tun: avoid disabling NAPI twice
59c51c3b54 tunnels: do not assume mac header is set in skb_tunnel_check_pmtu()
c9fc52c173 io_uring: ensure that send/sendmsg and recv/recvmsg check sqe->ioprio
b8def021ac epic100: fix use after free on rmmod
456bc33887 tipc: move bc link creation back to tipc_node_create
09f9946235 NFC: nxp-nci: Don't issue a zero length i2c_master_read()
7d363362e0 nfc: nfcmrvl: Fix irq_of_parse_and_map() return value
63b2fe509f net: bonding: fix use-after-free after 802.3ad slave unbind
7597ed348e net: bonding: fix possible NULL deref in rlb code
ac12337229 net/sched: act_api: Notify user space if any actions were flushed before error
91d3bb82c4 netfilter: nft_dynset: restore set element counter when failing to update
4b480a7940 s390: remove unneeded 'select BUILD_BIN2C'
e65027fdeb PM / devfreq: exynos-ppmu: Fix refcount leak in of_get_devfreq_events
653bdcd833 caif_virtio: fix race between virtio_device_ready() and ndo_open()
208ff79675 NFSD: restore EINVAL error translation in nfsd_commit()
db82bb6054 net: ipv6: unexport __init-annotated seg6_hmac_net_init()
eb1757ca20 usbnet: fix memory allocation in helpers
fae2a9fb1e linux/dim: Fix divide by 0 in RDMA DIM
b0cab8b517 RDMA/cm: Fix memory leak in ib_cm_insert_listen
9de276dfb2 RDMA/qedr: Fix reporting QP timeout attribute
a42bd00f00 net: dp83822: disable rx error interrupt
9c06d84855 net: dp83822: disable false carrier interrupt
c70ca16f72 net: tun: stop NAPI when detaching queues
bec1be0a74 net: tun: unlink NAPI from device on destruction
0b2499c801 net: dsa: bcm_sf2: force pause link settings
3f55912a1a selftests/net: pass ipv6_args to udpgso_bench's IPv6 TCP test
f7b8fb4584 virtio-net: fix race between ndo_open() and virtio_device_ready()
c0a28f2ddf net: usb: ax88179_178a: Fix packet receiving
8f74cb27c2 net: rose: fix UAF bugs caused by timer handler
6a0b9512a6 SUNRPC: Fix READ_PLUS crasher
ed03a650fb s390/archrandom: simplify back to earlier design and initialize earlier
d8bca518d5 dm raid: fix KASAN warning in raid5_add_disks
9bf2b0757b dm raid: fix accesses beyond end of raid member array
213c550deb powerpc/bpf: Fix use of user_pt_regs in uapi
68a34e478a powerpc/book3e: Fix PUD allocation size in map_kernel_page()
e188bbdb92 powerpc/prom_init: Fix kernel config grep
e6a7d30b65 nvdimm: Fix badblocks clear off-by-one error
0b99c4a189 nvme-pci: add NVME_QUIRK_BOGUS_NID for ADATA XPG SX6000LNP (AKA SPECTRIX S40G)
e77804158b ipv6: take care of disable_policy when restoring routes
03b9e01659 drm/amdgpu: To flush tlb for MMHUB of RAVEN series
ea86c1430c Linux 5.10.128
2d10984d99 net: mscc: ocelot: allow unregistered IP multicast flooding
6a656280e7 powerpc/ftrace: Remove ftrace init tramp once kernel init is complete
6b734f7b70 xfs: check sb_meta_uuid for dabuf buffer recovery
071e750ffb xfs: remove all COW fork extents when remounting readonly
1e76bd4c67 xfs: Fix the free logic of state in xfs_attr_node_hasname
0cdccc05da xfs: punch out data fork delalloc blocks on COW writeback failure
db3f8110c3 xfs: use kmem_cache_free() for kmem_cache objects
09c9902cd8 bcache: memset on stack variables in bch_btree_check() and bch_sectors_dirty_init()
c4ff3ffe01 tick/nohz: unexport __init-annotated tick_nohz_full_setup()
069fff50d4 drm: remove drm_fb_helper_modinit
52dc7f3f6f MAINTAINERS: add Amir as xfs maintainer for 5.10.y
fa7f6a5f56 Merge branch 'android12-5.10' into branch 'android12-5.10-lts'
deb587b1a4 Linux 5.10.127
1cca46c205 powerpc/pseries: wire up rng during setup_arch()
95d73d510b kbuild: link vmlinux only once for CONFIG_TRIM_UNUSED_KSYMS (2nd attempt)
feb5ab7986 random: update comment from copy_to_user() -> copy_to_iter()
959bbaf5b7 modpost: fix section mismatch check for exported init/exit sections
c980392af1 ARM: cns3xxx: Fix refcount leak in cns3xxx_init
889aad2203 memory: samsung: exynos5422-dmc: Fix refcount leak in of_get_dram_timings
44a5b3a073 ARM: Fix refcount leak in axxia_boot_secondary
30bbfeb480 soc: bcm: brcmstb: pm: pm-arm: Fix refcount leak in brcmstb_pm_probe
68f28d52e6 ARM: exynos: Fix refcount leak in exynos_map_pmu
59fdf10814 ARM: dts: imx6qdl: correct PU regulator ramp delay
fb70bd8675 ARM: dts: imx7: Move hsic_phy power domain to HSIC PHY node
f78acc4288 powerpc/powernv: wire up rng during setup_arch
7db1ba660b powerpc/rtas: Allow ibm,platform-dump RTAS call with null buffer address
1f5a9205a3 powerpc: Enable execve syscall exit tracepoint
ca144919af parisc: Enable ARCH_HAS_STRICT_MODULE_RWX
a1c902349a parisc/stifb: Fix fb_is_primary_device() only available with CONFIG_FB_STI
af0ff2da01 xtensa: Fix refcount leak bug in time.c
6c0839cf1b xtensa: xtfpga: Fix refcount leak bug in setup
501652a2ad iio: adc: adi-axi-adc: Fix refcount leak in adi_axi_adc_attach_client
d40514d440 iio: adc: axp288: Override TS pin bias current for some models
d579c893dd iio: adc: stm32: Fix IRQs on STM32F4 by removing custom spurious IRQs message
62284d45e2 iio: adc: stm32: Fix ADCs iteration in irq handler
e3ebb9d16c iio: imu: inv_icm42600: Fix broken icm42600 (chip id 0 value)
3e0af68b99 iio: adc: stm32: fix maximum clock rate for stm32mp15x
b07a30a774 iio: trigger: sysfs: fix use-after-free on remove
399788e819 iio: gyro: mpu3050: Fix the error handling in mpu3050_power_up()
c1ec7d52a2 iio: accel: mma8452: ignore the return value of reset operation
42caf44906 iio:accel:mxc4005: rearrange iio trigger get and register
e26dcf6279 iio:accel:bma180: rearrange iio trigger get and register
f26379e199 iio:chemical:ccs811: rearrange iio trigger get and register
4b6cdcff7c f2fs: attach inline_data after setting compression
2d7bdb6a5a usb: chipidea: udc: check request status before setting device address
656eca37aa USB: gadget: Fix double-free bug in raw_gadget driver
54604108be usb: gadget: Fix non-unique driver names in raw-gadget driver
d87dec22fd xhci-pci: Allow host runtime PM as default for Intel Meteor Lake xHCI
114080d04a xhci-pci: Allow host runtime PM as default for Intel Raptor Lake xHCI
b8142a8465 xhci: turn off port power in shutdown
116c3e81b0 usb: typec: wcove: Drop wrong dependency to INTEL_SOC_PMIC
a547662534 iio: adc: vf610: fix conversion mode sysfs node name
58c3a27e9c iio: mma8452: fix probe fail when device tree compatible is used.
5ee016f612 s390/cpumf: Handle events cycles and instructions identical
abe487a88a gpio: winbond: Fix error code in winbond_gpio_get()
30531e0d7b nvme: move the Samsung X5 quirk entry to the core quirks
169f7d7705 nvme-pci: add NO APST quirk for Kioxia device
938f594266 nvme-pci: allocate nvme_command within driver pdu
ba388d4e9a nvme: don't check nvme_req flags for new req
e7ccaa1aba nvme: mark nvme_setup_passsthru() inline
3ee62a1f07 nvme: split nvme_alloc_request()
fe06c692cd nvme: centralize setting the timeout in nvme_alloc_request
afbc954e78 Revert "net/tls: fix tls_sk_proto_close executed repeatedly"
340fbdc801 virtio_net: fix xdp_rxq_info bug after suspend/resume
3bccf82169 igb: Make DMA faster when CPU is active on the PCIe link
7d7450363f regmap-irq: Fix a bug in regmap_irq_enable() for type_in_mask chips
40b3815b2c ice: ethtool: advertise 1000M speeds properly
7b564e3254 afs: Fix dynamic root getattr
3c22192db0 MIPS: Remove repetitive increase irq_err_count
cc649a7865 x86/xen: Remove undefined behavior in setup_features()
b60c375ad1 selftests: netfilter: correct PKTGEN_SCRIPT_PATHS in nft_concat_range.sh
20119c1e0f udmabuf: add back sanity check
e82376b632 net/tls: fix tls_sk_proto_close executed repeatedly
cec9867ee5 erspan: do not assume transport header is always set
acf76125bb drm/msm/dp: fix connect/disconnect handled at irq_hpd
61f8f4034c drm/msm/dp: promote irq_hpd handle to handle link training correctly
d11cb08215 drm/msm/dp: deinitialize mainlink if link training failed
3d67cb00cb drm/msm/dp: fixes wrong connection state caused by failure of link train
efb2b69160 drm/msm/dp: check core_initialized before disable interrupts at dp_display_unbind()
d16a433982 drm/msm/mdp4: Fix refcount leak in mdp4_modeset_init_intf
363fd6e346 net/sched: sch_netem: Fix arithmetic in netem_dump() for 32-bit platforms
2e3216b929 bonding: ARP monitor spams NETDEV_NOTIFY_PEERS notifiers
c12a2c9b1b igb: fix a use-after-free issue in igb_clean_tx_ring
361c5521c1 tipc: fix use-after-free Read in tipc_named_reinit
f299d3fbe4 tipc: simplify the finalize work queue
ab7f565ac7 phy: aquantia: Fix AN when higher speeds than 1G are not advertised
a51c199e4d bpf, x86: Fix tail call count offset calculation on bpf2bpf call
4ae116428e drm/sun4i: Fix crash during suspend after component bind failure
516760f1d2 bpf: Fix request_sock leak in sk lookup helpers
505a375eea drm/msm: use for_each_sgtable_sg to iterate over scatterlist
10eb239e29 scsi: scsi_debug: Fix zone transition to full condition
15cc30ac2a netfilter: use get_random_u32 instead of prandom
95f80c8843 netfilter: nftables: add nft_parse_register_store() and use it
ec9b0a8d30 netfilter: nftables: add nft_parse_register_load() and use it
8adedb4711 drm/msm: Fix double pm_runtime_disable() call
8682335375 USB: serial: option: add Quectel RM500K module support
9e6e063e54 USB: serial: option: add Quectel EM05-G modem
0b3006a862 USB: serial: option: add Telit LE910Cx 0x1250 composition
f6a266e0dc dm mirror log: clear log bits up to BITS_PER_LONG boundary
03d1874b82 dm era: commit metadata in postsuspend after worker stops
273106c2df ata: libata: add qc->flags in ata_qc_complete_template tracepoint
156427b312 mtd: rawnand: gpmi: Fix setting busy timeout setting
07e56884cd mmc: sdhci-pci-o2micro: Fix card detect by dealing with debouncing
0ae82e1ccb btrfs: add error messages to all unrecognized mount options
49e3e449bc net: openvswitch: fix parsing of nw_proto for IPv6 fragments
1508658aec ALSA: hda/realtek: Add quirk for Clevo NS50PU
6e8e503159 ALSA: hda/realtek: Add quirk for Clevo PD70PNT
80307458a1 ALSA: hda/realtek: Apply fixup for Lenovo Yoga Duet 7 properly
7fcbc89d47 ALSA: hda/realtek - ALC897 headset MIC no sound
f5ea433d56 ALSA: hda/realtek: Add mute LED quirk for HP Omen laptop
6437329060 ALSA: hda/conexant: Fix missing beep setup
12a6be5d11 ALSA: hda/via: Fix missing beep setup
5e80f923b8 random: quiet urandom warning ratelimit suppression message
310ebbd9f5 random: schedule mix_interrupt_randomness() less often
3acb7dc242 vt: drop old FONT ioctls
9cae50bdfa Linux 5.10.126
fb2fbb3c10 io_uring: use separate list entry for iopoll requests
6a7c3bcc3c Linux 5.10.125
df3f3bb505 io_uring: add missing item types for various requests
1a264b3a69 arm64: mm: Don't invalidate FROM_DEVICE buffers at start of DMA transfer
a1508d164e serial: core: Initialize rs485 RTS polarity already on probe
7ccb026ecb tcp: drop the hash_32() part from the index calculation
9429b75bc2 tcp: increase source port perturb table to 2^16
24b922a5da tcp: dynamically allocate the perturb table used by source ports
d28e64b1c6 tcp: add small random increments to the source port
dd46a868fc tcp: use different parts of the port_offset for index and offset
743acb5207 tcp: add some entropy in __inet_hash_connect()
16b1994679 usb: gadget: u_ether: fix regression in setting fixed MAC address
355be61311 zonefs: fix zonefs_iomap_begin() for reads
ee4677b78e s390/mm: use non-quiescing sske for KVM switch to keyed guest
73c2a811f6 Revert "xfrm: Add possibility to set the default to block if we have no policy"
e21944a82a Revert "net: xfrm: fix shift-out-of-bounce"
f7160ab103 Revert "xfrm: make user policy API complete"
df0ff8d194 Revert "xfrm: notify default policy on update"
4ead88c0e8 Revert "xfrm: fix dflt policy check when there is no policy configured"
42dadcf0a8 Revert "xfrm: rework default policy structure"
ece9c2a70f Revert "xfrm: fix "disable_policy" flag use when arriving from different devices"
9dcde7a741 Revert "include/uapi/linux/xfrm.h: Fix XFRM_MSG_MAPPING ABI breakage"
4f3fee72a7 Linux 5.10.124
e0b6018894 clk: imx8mp: fix usb_root_clk parent
a3e50506ea powerpc/book3e: get rid of #include <generated/compile.h>
ff4443f3fc igc: Enable PCIe PTM
f0a7adff63 Revert "PCI: Make pci_enable_ptm() private"
e1513a714d net: openvswitch: fix misuse of the cached connection on tuple changes
09b55dc90b net/sched: act_police: more accurate MTU policing
73bc8a5e8e dma-direct: don't over-decrypt memory
aa9a001efa virtio-pci: Remove wrong address verification in vp_del_vqs()
be98641034 ALSA: hda/realtek: fix right sounds and mute/micmute LEDs for HP machine
401bef1f95 KVM: SVM: Use kzalloc for sev ioctl interfaces to prevent kernel data leak
d6be031a2f KVM: x86: Account a variety of miscellaneous allocations
d74d7865e2 KVM: arm64: Don't read a HW interrupt pending state in user context
bfd004a1d3 ext4: add reserved GDT blocks check
0ca74dacfd ext4: make variable "count" signed
6fdaf31ad5 ext4: fix bug_on ext4_mb_use_inode_pa
e27430c1f1 drm/amd/display: Cap OLED brightness per max frame-average luminance
ba751f0d25 dm mirror log: round up region bitmap size to BITS_PER_LONG
33ba36351e serial: 8250: Store to lsr_save_flags after lsr read
57901c658f usb: gadget: lpc32xx_udc: Fix refcount leak in lpc32xx_udc_probe
a44a8a762f usb: dwc2: Fix memory leak in dwc2_hcd_init
791da3e6c8 USB: serial: io_ti: add Agilent E5805A support
0e13274bc6 USB: serial: option: add support for Cinterion MV31 with new baseline
d721986e96 crypto: memneq - move into lib/
308b8f31c0 comedi: vmk80xx: fix expression for tx buffer size
9308be3d9a mei: me: add raptor lake point S DID
9ea9c92275 i2c: designware: Use standard optional ref clock implementation
506a88a5bf irqchip/gic-v3: Fix refcount leak in gic_populate_ppi_partitions
7c9dd9d23f irqchip/gic-v3: Fix error handling in gic_populate_ppi_partitions
e52a58b79f irqchip/gic/realview: Fix refcount leak in realview_gic_of_init
716587a57a i2c: npcm7xx: Add check for platform_driver_register
b559ef9dfc faddr2line: Fix overlapping text section failures, the sequel
7fa28a7c3d block: Fix handling of offline queues in blk_mq_alloc_request_hctx()
2d825fb53b certs/blacklist_hashes.c: fix const confusion in certs blacklist
bc28fde909 arm64: ftrace: consistently handle PLTs.
e177f17fe4 arm64: ftrace: fix branch range checks
64072389be net: ax25: Fix deadlock caused by skb_recv_datagram in ax25_recvmsg
28069e026e net: bgmac: Fix an erroneous kfree() in bgmac_remove()
984793f255 mlxsw: spectrum_cnt: Reorder counter pools
b90ae84a8a nvme: add device name to warning in uuid_show()
42f7cbe2c2 nvme: use sysfs_emit instead of sprintf
63b26fe025 drm/i915/reset: Fix error_state_read ptr + offset use
2b2180449a misc: atmel-ssc: Fix IRQ check in ssc_probe
65ca4db68b tty: goldfish: Fix free_irq() on remove
5334455067 Drivers: hv: vmbus: Release cpu lock in error case
814092927a i40e: Fix call trace in setup_tx_descriptors
43dfd1169c i40e: Fix calculating the number of queue pairs
ef4d73da0a i40e: Fix adding ADQ filter to TC0
db965e2757 clocksource: hyper-v: unexport __init-annotated hv_init_clocksource()
8acc3e228e pNFS: Avoid a live lock condition in pnfs_update_layout()
03ea83324a pNFS: Don't keep retrying if the server replied NFS4ERR_LAYOUTUNAVAILABLE
4603a37f6e random: credit cpu and bootloader seeds by default
9d667348dc gpio: dwapb: Don't print error on -EPROBE_DEFER
f3c8bfd6dc MIPS: Loongson-3: fix compile mips cpu_hwmon as module build error.
85340c0634 mellanox: mlx5: avoid uninitialized variable warning with gcc-12
38c519df8e net: ethernet: mtk_eth_soc: fix misuse of mem alloc interface netdev[napi]_alloc_frag
b8879ca1fd ipv6: Fix signed integer overflow in l2tp_ip6_sendmsg
0eeec1a8b0 nfc: nfcmrvl: Fix memory leak in nfcmrvl_play_deferred
6c18f47f47 virtio-mmio: fix missing put_device() when vm_cmdline_parent registration failed
d539feb6df ALSA: hda/realtek - Add HW8326 support
16dd002eb8 scsi: pmcraid: Fix missing resource cleanup in error case
410b692621 scsi: ipr: Fix missing/incorrect resource cleanup in error case
85acc5bf05 scsi: lpfc: Allow reduced polling rate for nvme_admin_async_event cmd completion
916145bf9d scsi: lpfc: Fix port stuck in bypassed state after LIP in PT2PT topology
f416fee125 scsi: vmw_pvscsi: Expand vcpuHint to 16 bits
0e9994b865 Input: soc_button_array - also add Lenovo Yoga Tablet2 1051F to dmi_use_low_level_irq
2e640e5e44 ASoC: wm_adsp: Fix event generation for wm_adsp_fw_put()
a572c74402 ASoC: es8328: Fix event generation for deemphasis control
c7b8c3758f ASoC: wm8962: Fix suspend while playing music
8656623bdc quota: Prevent memory allocation recursion while holding dq_lock
36cd19e7d4 ata: libata-core: fix NULL pointer deref in ata_host_alloc_pinfo()
440b2a62da ASoC: cs42l51: Correct minimum value for SX volume control
f93d8fe3dc ASoC: cs42l56: Correct typo in minimum level for SX volume controls
13e5b76d3d ASoC: cs42l52: Correct TLV for Bypass Volume
b8a47bcc4d ASoC: cs53l30: Correct number of volume levels on SX controls
70e355867d ASoC: cs35l36: Update digital volume TLV
cb6a0b83f1 ASoC: cs42l52: Fix TLV scales for mixer controls
d7be05aff2 dma-debug: make things less spammy under memory pressure
1b54c00657 ASoC: nau8822: Add operation for internal PLL off and on
2c9548bc26 powerpc/kasan: Silence KASAN warnings in __get_wchan()
b5699bff1d arm64: dts: imx8mm-beacon: Enable RTS-CTS on UART3
28bbdca6a7 bpf: Fix incorrect memory charge cost calculation in stack_map_alloc()
f14816f2f9 nfsd: Replace use of rwsem with errseq_t
56a7f57da5 9p: missing chunk of "fs/9p: Don't update file type when updating file attributes"
2a59239b22 Linux 5.10.123
aa238a92cc x86/speculation/mmio: Print SMT warning
bde15fdcce KVM: x86/speculation: Disable Fill buffer clear within guests
6df693dca3 x86/speculation/mmio: Reuse SRBDS mitigation for SBDS
cf1c01a5e4 x86/speculation/srbds: Update SRBDS mitigation selection
001415e4e6 x86/speculation/mmio: Add sysfs reporting for Processor MMIO Stale Data
3eb1180564 x86/speculation/mmio: Enable CPU Fill buffer clearing on idle
56f0bca5e9 x86/bugs: Group MDS, TAA & Processor MMIO Stale Data mitigations
26f6f231f6 x86/speculation/mmio: Add mitigation for Processor MMIO Stale Data
f83d4e5be4 x86/speculation: Add a common function for MD_CLEAR mitigation update
e66310bc96 x86/speculation/mmio: Enumerate Processor MMIO Stale Data bug
f8a85334a5 Documentation: Add documentation for Processor MMIO Stale Data
5754c570a5 Linux 5.10.122
9ba2b4ac35 tcp: fix tcp_mtup_probe_success vs wrong snd_cwnd
5e34b49756 dmaengine: idxd: add missing callback function to support DMA_INTERRUPT
b8c17121f0 zonefs: fix handling of explicit_open option on mount
ef51997771 PCI: qcom: Fix pipe clock imbalance
63bcb9da91 md/raid0: Ignore RAID0 layout if the second zone has only one device
418db40cc7 interconnect: Restore sync state by ignoring ipa-virt in provider count
bcae8f8338 interconnect: qcom: sc7180: Drop IP0 interconnects
fe6caf5122 powerpc/mm: Switch obsolete dssall to .long
3be74fc0af powerpc/32: Fix overread/overwrite of thread_struct via ptrace
fa0d3d71dc drm/atomic: Force bridge self-refresh-exit on CRTC switch
dbe04e874d drm/bridge: analogix_dp: Support PSR-exit to disable transition
61297ee0c3 Input: bcm5974 - set missing URB_NO_TRANSFER_DMA_MAP urb flag
2dba96d19d ixgbe: fix unexpected VLAN Rx in promisc mode on VF
91620cded9 ixgbe: fix bcast packets Rx on VF after promisc removal
cdd9227373 nfc: st21nfca: fix incorrect sizing calculations in EVT_TRANSACTION
54423649bc nfc: st21nfca: fix memory leaks in EVT_TRANSACTION handling
4f0a2c46f5 nfc: st21nfca: fix incorrect validating logic in EVT_TRANSACTION
c4e4c07d86 net: phy: dp83867: retrigger SGMII AN when link change
133c9870cd mmc: block: Fix CQE recovery reset success
0248a8c844 ata: libata-transport: fix {dma|pio|xfer}_mode sysfs files
471a413201 cifs: fix reconnect on smb3 mount types
9023ecfd33 cifs: return errors during session setup during reconnects
b423cd2a81 ALSA: hda/realtek: Fix for quirk to enable speaker output on the Lenovo Yoga DuetITL 2021
94bd216d17 ALSA: hda/conexant - Fix loopback issue with CX20632
13639c970f scripts/gdb: change kernel config dumping method
b6ea26873e vringh: Fix loop descriptors check in the indirect cases
362e3b3a59 nodemask: Fix return values to be unsigned
a262e1255b cifs: version operations for smb20 unneeded when legacy support disabled
01137d8980 s390/gmap: voluntarily schedule during key setting
f72df77600 nbd: fix io hung while disconnecting device
122e4adaff nbd: fix race between nbd_alloc_config() and module removal
c0868f6e72 nbd: call genl_unregister_family() first in nbd_cleanup()
cb8da20d71 jump_label,noinstr: Avoid instrumentation for JUMP_LABEL=n builds
320acaf84a x86/cpu: Elide KCSAN for cpu_has() and friends
8287687821 modpost: fix undefined behavior of is_arm_mapping_symbol()
fee8ae0a0b drm/radeon: fix a possible null pointer dereference
3e57686830 ceph: allow ceph.dir.rctime xattr to be updatable
7fa8312879 Revert "net: af_key: add check for pfkey_broadcast in function pfkey_process"
ebfe279725 scsi: myrb: Fix up null pointer access on myrb_cleanup()
7eb32f286e md: protect md_unregister_thread from reentrancy
668c3f9fa2 watchdog: wdat_wdt: Stop watchdog when rebooting the system
e20bc8b5a2 kernfs: Separate kernfs_pr_cont_buf and rename_lock.
1e3b3a5762 serial: msm_serial: disable interrupts in __msm_console_write()
ff727ab0b7 staging: rtl8712: fix uninit-value in r871xu_drv_init()
33ef21d554 staging: rtl8712: fix uninit-value in usb_read8() and friends
f3f754d72d clocksource/drivers/sp804: Avoid error on multiple instances
abf3b22261 extcon: Modify extcon device to be created after driver data is set
41ec946694 misc: rtsx: set NULL intfdata when probe fails
5b0c0298f7 usb: dwc2: gadget: don't reset gadget's driver->bus
468fe959ea sysrq: do not omit current cpu when showing backtrace of all active CPUs
f4cb24706c USB: hcd-pci: Fully suspend across freeze/thaw cycle
ffe9440d69 drivers: usb: host: Fix deadlock in oxu_bus_suspend()
6e2273eefa drivers: tty: serial: Fix deadlock in sa1100_set_termios()
ee105039d3 USB: host: isp116x: check return value after calling platform_get_resource()
0f69d7d5e9 drivers: staging: rtl8192e: Fix deadlock in rtllib_beacons_stop()
66f769762f drivers: staging: rtl8192u: Fix deadlock in ieee80211_beacons_stop()
cb7147afd3 tty: Fix a possible resource leak in icom_probe
d68d5e68b7 tty: synclink_gt: Fix null-pointer-dereference in slgt_clean()
61ca1b97ad lkdtm/usercopy: Expand size of "out of frame" object
7821d743ab iio: st_sensors: Add a local lock for protecting odr
5a89a92efc staging: rtl8712: fix a potential memory leak in r871xu_drv_init()
8caa4b7d41 iio: dummy: iio_simple_dummy: check the return value of kstrdup()
f091e29ed8 drm: imx: fix compiler warning with gcc-12
96bf5ed057 net: altera: Fix refcount leak in altera_tse_mdio_create
fbeb8dfa8b ip_gre: test csum_start instead of transport header
1981cd7a77 net/mlx5: fs, fail conflicting actions
652418d82b net/mlx5: Rearm the FW tracer after each tracer event
5d9c1b081a net: ipv6: unexport __init-annotated seg6_hmac_init()
be3884d5cd net: xfrm: unexport __init-annotated xfrm4_protocol_init()
7759c32228 net: mdio: unexport __init-annotated mdio_bus_init()
b585b87fd5 SUNRPC: Fix the calculation of xdr->end in xdr_get_next_encode_buffer()
3d8122e169 net/mlx4_en: Fix wrong return value on ioctl EEPROM query failure
c2ae49a113 net: dsa: lantiq_gswip: Fix refcount leak in gswip_gphy_fw_list
0cf7aaff29 bpf, arm64: Clear prog->jited_len along prog->jited
c61848500a af_unix: Fix a data-race in unix_dgram_peer_wake_me().
be9581f4fd xen: unexport __init-annotated xen_xlate_map_ballooned_pages()
86c87d2c03 netfilter: nf_tables: bail out early if hardware offload is not supported
330c0c6cd2 netfilter: nf_tables: memleak flow rule from commit path
67e2d44873 netfilter: nf_tables: release new hooks on unsupported flowtable flags
19cb3ece14 ata: pata_octeon_cf: Fix refcount leak in octeon_cf_probe
ec5548066d netfilter: nf_tables: always initialize flowtable hook list in transaction
7fd03e34f0 powerpc/kasan: Force thread size increase with KASAN
7a248f9c74 netfilter: nf_tables: delete flowtable hooks via transaction list
9edafbc7ec netfilter: nat: really support inet nat without l3 address
8dbae5affb xprtrdma: treat all calls not a bcall when bc_serv is NULL
8b3d5bafb1 video: fbdev: pxa3xx-gcu: release the resources correctly in pxa3xx_gcu_probe/remove()
c09b873f3f video: fbdev: hyperv_fb: Allow resolutions with size > 64 MB for Gen1
0ee5b9644f NFSv4: Don't hold the layoutget locks across multiple RPC calls
95a0ba85c1 dmaengine: zynqmp_dma: In struct zynqmp_dma_chan fix desc_size data type
2c08cae19d m68knommu: fix undefined reference to `_init_sp'
d99f04df32 m68knommu: set ZERO_PAGE() to the allocated zeroed page
344a55ccf5 i2c: cadence: Increase timeout per message if necessary
32bea51fe4 f2fs: remove WARN_ON in f2fs_is_valid_blkaddr
54c1e0e3bb iommu/arm-smmu-v3: check return value after calling platform_get_resource()
3660db29b0 iommu/arm-smmu: fix possible null-ptr-deref in arm_smmu_device_probe()
9e801c891a tracing: Avoid adding tracer option before update_tracer_options
1788e6dbb6 tracing: Fix sleeping function called from invalid context on RT kernel
2f452a3306 bootconfig: Make the bootconfig.o as a normal object file
c667b3872a mips: cpc: Fix refcount leak in mips_cpc_default_phys_base
76b226eaf0 dmaengine: idxd: set DMA_INTERRUPT cap bit
32be2b805a perf c2c: Fix sorting in percent_rmt_hitm_cmp()
71cbce7503 driver core: Fix wait_for_device_probe() & deferred_probe_timeout interaction
b8fac8e321 tipc: check attribute length for bearer name
c1f0187025 scsi: sd: Fix potential NULL pointer dereference
d2e297eaf4 afs: Fix infinite loop found by xfstest generic/676
04622d6318 gpio: pca953x: use the correct register address to do regcache sync
0a0f7f8414 tcp: tcp_rtx_synack() can be called from process context
e05dd93826 net: sched: add barrier to fix packet stuck problem for lockless qdisc
e9fe72b95d net/mlx5e: Update netdev features after changing XDP state
b50eef7a38 net/mlx5: correct ECE offset in query qp output
ea5edd015f net/mlx5: Don't use already freed action pointer
bf2af9b243 sfc: fix wrong tx channel offset with efx_separate_tx_channels
8f81a4113e sfc: fix considering that all channels have TX queues
7ac3a034d9 nfp: only report pause frame configuration for physical device
630e0a10c0 net/smc: fixes for converting from "struct smc_cdc_tx_pend **" to "struct smc_wr_tx_pend_priv *"
b97550e380 riscv: read-only pages should not be writable
8f49e1694c bpf: Fix probe read error in ___bpf_prog_run()
6d8d3f68cb ubi: ubi_create_volume: Fix use-after-free when volume creation failed
f413e4d7cd ubi: fastmap: Fix high cpu usage of ubi_bgt by making sure wl_pool not empty
3252d327f9 jffs2: fix memory leak in jffs2_do_fill_super
741e49eacd modpost: fix removing numeric suffixes
42658e47f1 net: dsa: mv88e6xxx: Fix refcount leak in mv88e6xxx_mdios_register
f7ba2cc57f net: ethernet: ti: am65-cpsw-nuss: Fix some refcount leaks
71ae30662e net: ethernet: mtk_eth_soc: out of bounds read in mtk_hwlro_get_fdir_entry()
503a3fd646 net: sched: fixed barrier to prevent skbuff sticking in qdisc backlog
ee89d7fd49 s390/crypto: fix scatterwalk_unmap() callers in AES-GCM
e892a7e60f clocksource/drivers/oxnas-rps: Fix irq_of_parse_and_map() return value
1d7361679f ASoC: fsl_sai: Fix FSL_SAI_xDR/xFR definition
910b1cdf6c watchdog: ts4800_wdt: Fix refcount leak in ts4800_wdt_probe
b3354f2046 watchdog: rti-wdt: Fix pm_runtime_get_sync() error checking
36ee9ffca8 driver core: fix deadlock in __device_attach
823f24f2e3 driver: base: fix UAF when driver_attach failed
7a6337bfed bus: ti-sysc: Fix warnings for unbind for serial
985706bd3b firmware: dmi-sysfs: Fix memory leak in dmi_sysfs_register_handle
94acaaad47 serial: stm32-usart: Correct CSIZE, bits, and parity
b7e560d2ff serial: st-asc: Sanitize CSIZE and correct PARENB for CS7
afcfc3183c serial: sifive: Sanitize CSIZE and c_iflag
a9f6bee486 serial: sh-sci: Don't allow CS5-6
00456b932e serial: txx9: Don't allow CS5-6
22e975796f serial: rda-uart: Don't allow CS5-6
ff4ce2979b serial: digicolor-usart: Don't allow CS5-6
5cd331bcf0 serial: 8250_fintek: Check SER_RS485_RTS_* only with RS485
260792d5c9 serial: meson: acquire port->lock in startup()
82bfea344e rtc: mt6397: check return value after calling platform_get_resource()
d54a51b518 clocksource/drivers/riscv: Events are stopped during CPU suspend
5b3e990f85 soc: rockchip: Fix refcount leak in rockchip_grf_init
cfe8a0967d extcon: ptn5150: Add queue work sync before driver release
96414e2cdc coresight: cpu-debug: Replace mutex with mutex_trylock on panic notifier
47ebc50dc2 serial: sifive: Report actual baud base rather than fixed 115200
ab35308bbd phy: qcom-qmp: fix pipe-clock imbalance on power-on failure
52f327a45c rpmsg: qcom_smd: Fix returning 0 if irq_of_parse_and_map() fails
c10333c451 iio: adc: sc27xx: Fine tune the scale calibration values
3747429834 iio: adc: sc27xx: fix read big scale voltage not right
b30f2315a3 iio: proximity: vl53l0x: Fix return value check of wait_for_completion_timeout
43823ceb26 iio: adc: stmpe-adc: Fix wait_for_completion_timeout return value check
6f01c0fb8e usb: typec: mux: Check dev_set_name() return value
7027c890ff firmware: stratix10-svc: fix a missing check on list iterator
70ece3c5ec misc: fastrpc: fix an incorrect NULL check on list iterator
2a1bf8e5ad usb: dwc3: pci: Fix pm_runtime_get_sync() error checking
8ae4fed195 rpmsg: qcom_smd: Fix irq_of_parse_and_map() return value
572211d631 pwm: lp3943: Fix duty calculation in case period was clamped
f9782b26d6 staging: fieldbus: Fix the error handling path in anybuss_host_common_probe()
b382c0c3b8 usb: musb: Fix missing of_node_put() in omap2430_probe
6b7cf22122 USB: storage: karma: fix rio_karma_init return
e100742823 usb: usbip: add missing device lock on tweak configuration cmd
bcbb795a9e usb: usbip: fix a refcount leak in stub_probe()
4e3a2d77bd tty: serial: fsl_lpuart: fix potential bug when using both of_alias_get_id and ida_simple_get
e27376f5aa tty: n_tty: Restore EOF push handling behavior
11bc6eff3a tty: serial: owl: Fix missing clk_disable_unprepare() in owl_uart_probe
ee6c33b29e tty: goldfish: Use tty_port_destroy() to destroy port
56ac04f35f lkdtm/bugs: Check for the NULL pointer after calling kmalloc
03efa70eb0 iio: adc: ad7124: Remove shift from scan_type
4610b06761 staging: greybus: codecs: fix type confusion of list iterator variable
1509d2335d pcmcia: db1xxx_ss: restrict to MIPS_DB1XXX boards
e2e52b40ef Linux 5.10.121
47c1680e51 md: bcache: check the return value of kzalloc() in detached_dev_do_request()
a67100f426 ext4: only allow test_dummy_encryption when supported
96662c7746 MIPS: IP30: Remove incorrect `cpu_has_fpu' override
57e561573f MIPS: IP27: Remove incorrect `cpu_has_fpu' override
bb55ca1612 RDMA/rxe: Generate a completion for unsupported/invalid opcode
72268945b1 Revert "random: use static branch for crng_ready()"
6b03dc67dd block: fix bio_clone_blkg_association() to associate with proper blkcg_gq
51f724bffa bfq: Make sure bfqg for which we are queueing requests is online
0285718e28 bfq: Get rid of __bio_blkcg() usage
80b0a2b3df bfq: Remove pointless bfq_init_rq() calls
13599aac1b bfq: Drop pointless unlock-lock pair
7d172b9dc9 bfq: Avoid merging queues with different parents
54cdc10ac7 thermal/core: Fix memory leak in the error path
b132abaa65 thermal/core: fix a UAF bug in __thermal_cooling_device_register()
ec1378f2fa kseltest/cgroup: Make test_stress.sh work if run interactively
82b2b60b67 xfs: assert in xfs_btree_del_cursor should take into account error
f1916a88c8 xfs: consider shutdown in bmapbt cursor delete assert
e3ffe7387c xfs: force log and push AIL to clear pinned inodes when aborting mount
0b229d03d0 xfs: restore shutdown check in mapped write fault path
3d05a855dc xfs: fix incorrect root dquot corruption error when switching group/project quota types
893cf5f68a xfs: fix chown leaking delalloc quota blocks when fssetxattr fails
643ceee253 xfs: sync lazy sb accounting on quiesce of read-only mounts
af26bfb04a xfs: set inode size after creating symlink
d27f0000d7 net: ipa: fix page free in ipa_endpoint_replenish_one()
70124d94f4 net: ipa: fix page free in ipa_endpoint_trans_release()
2156dc3904 phy: qcom-qmp: fix reset-controller leak on probe errors
67e3404889 coresight: core: Fix coresight device probe failure issue
77692c02e1 blk-iolatency: Fix inflight count imbalances and IO hangs on offline
19e5aac38a vdpasim: allow to enable a vq repeatedly
ec029087df dt-bindings: gpio: altera: correct interrupt-cells
0ac587c61f docs/conf.py: Cope with removal of language=None in Sphinx 5.0.0
6182c71a0c SMB3: EBADF/EIO errors in rename/open caused by race condition in smb2_compound_op
d6b9b220d1 ARM: pxa: maybe fix gpio lookup tables
39c61f4f7f ARM: dts: s5pv210: Remove spi-cs-high on panel in Aries
6f3673c8d8 phy: qcom-qmp: fix struct clk leak on probe errors
09a84dad95 arm64: dts: qcom: ipq8074: fix the sleep clock frequency
591c3481b1 gma500: fix an incorrect NULL check on list iterator
c521f42dd2 tilcdc: tilcdc_external: fix an incorrect NULL check on list iterator
10c5088a31 serial: pch: don't overwrite xmit->buf[0] by x_char
59afd4f287 bcache: avoid journal no-space deadlock by reserving 1 journal bucket
0cf22f234e bcache: remove incremental dirty sector counting for bch_sectors_dirty_init()
3f686b249b bcache: improve multithreaded bch_sectors_dirty_init()
46c2b5f81c bcache: improve multithreaded bch_btree_check()
4e2fbe8cda stm: ltdc: fix two incorrect NULL checks on list iterator
dc12a64cf8 carl9170: tx: fix an incorrect use of list iterator
8f1bc0edf5 ASoC: rt5514: Fix event generation for "DSP Voice Wake Up" control
769ec2a824 rtl818x: Prevent using not initialized queues
d787a57a17 xtensa/simdisk: fix proc_read_simdisk()
63758dd959 hugetlb: fix huge_pmd_unshare address update
90ad54714e nodemask.h: fix compilation error with GCC12
e9514bce2f iommu/msm: Fix an incorrect NULL check on list iterator
82c888e51c ftrace: Clean up hash direct_functions on register failures
c26ccbaeb8 kexec_file: drop weak attribute from arch_kexec_apply_relocations[_add]
cf0dabc374 um: Fix out-of-bounds read in LDT setup
7f8fd5dd43 um: chan_user: Fix winch_tramp() return value
873069e393 mac80211: upgrade passive scan to active scan on DFS channels after beacon rx
22741dd048 cfg80211: declare MODULE_FIRMWARE for regulatory.db
e87fedad4a irqchip: irq-xtensa-mx: fix initial IRQ affinity
be7ae7cd1c irqchip/armada-370-xp: Do not touch Performance Counter Overflow on A375, A38x, A39x
df7f0f8be3 csky: patch_text: Fixup last cpu should be master
31dca00d0c RDMA/hfi1: Fix potential integer multiplication overflow errors
09408080ad Kconfig: Add option for asm goto w/ tied outputs to workaround clang-13 bug
b67adaec34 ima: remove the IMA_TEMPLATE Kconfig option
577a959cb0 media: coda: Add more H264 levels for CODA960
4005f6a25c media: coda: Fix reported H264 profile
d09dad0057 mtd: cfi_cmdset_0002: Use chip_ready() for write on S29GL064N
08788b917b mtd: cfi_cmdset_0002: Move and rename chip_check/chip_ready/chip_good_for_write
b2b0144422 md: fix an incorrect NULL check in md_reload_sb
2401f1cf3d md: fix an incorrect NULL check in does_sb_need_changing
e28321e013 drm/i915/dsi: fix VBT send packet port selection for ICL+
495ac77576 drm/bridge: analogix_dp: Grab runtime PM reference for DP-AUX
addf0ae792 drm/nouveau/kms/nv50-: atom: fix an incorrect NULL check on list iterator
97a9ec86cc drm/nouveau/clk: Fix an incorrect NULL check on list iterator
436cff507f drm/etnaviv: check for reaped mapping in etnaviv_iommu_unmap_gem
be585921f2 drm/amdgpu/cs: make commands with 0 chunks illegal behaviour.
556e404691 scsi: ufs: qcom: Add a readl() to make sure ref_clk gets enabled
f297dc2364 scsi: dc395x: Fix a missing check on list iterator
337e365507 ocfs2: dlmfs: fix error handling of user_dlm_destroy_lock
4ca3ac06e7 dlm: fix missing lkb refcount handling
899bc44291 dlm: fix plock invalid read
74114d26e9 s390/perf: obtain sie_block from the right address
7994d89012 mm, compaction: fast_find_migrateblock() should return pfn in the target zone
99fd821f56 PCI: qcom: Fix unbalanced PHY init on probe errors
c0e129dafc PCI: qcom: Fix runtime PM imbalance on probe errors
2b4c6ad382 PCI/PM: Fix bridge_d3_blacklist[] Elo i2 overwrite of Gigabyte X299
058cb6d86b tracing: Fix potential double free in create_var_ref()
a2b9edc3f8 ACPI: property: Release subnode properties with data nodes
ff4cafa517 ext4: avoid cycles in directory h-tree
da2f059192 ext4: verify dir block before splitting it
4fd58b5cf1 ext4: fix bug_on in __es_tree_search
cc5b09cb6d ext4: filter out EXT4_FC_REPLAY from on-disk superblock field s_state
1b061af037 ext4: fix bug_on in ext4_writepages
adf490083c ext4: fix warning in ext4_handle_inode_extension
dd887f83ea ext4: fix use-after-free in ext4_rename_dir_prepare
70a7dea846 bfq: Track whether bfq_group is still online
b06691af08 bfq: Update cgroup information before merging bio
4dfc12f8c9 bfq: Split shared queues on move between cgroups
c072cab98b efi: Do not import certificates from UEFI Secure Boot for T2 Macs
9a9dc60da7 fs-writeback: writeback_sb_inodes:Recalculate 'wrote' according skipped pages
c1ad58de13 iwlwifi: mvm: fix assert 1F04 upon reconfig
6118bbdf69 wifi: mac80211: fix use-after-free in chanctx code
efdefbe8b7 f2fs: fix to do sanity check for inline inode
2221a2d410 f2fs: fix fallocate to use file_modified to update permissions consistently
ef221b738b f2fs: fix to do sanity check on total_data_blocks
196f72e089 f2fs: don't need inode lock for system hidden quota
2e790aa378 f2fs: fix deadloop in foreground GC
ccd58045be f2fs: fix to clear dirty inode in f2fs_evict_inode()
a34d7b4989 f2fs: fix to do sanity check on block address in f2fs_do_zero_range()
2766ddaf45 f2fs: fix to avoid f2fs_bug_on() in dec_valid_node_count()
d8b6aaeb9a perf jevents: Fix event syntax error caused by ExtSel
c8c2802407 perf c2c: Use stdio interface if slang is not supported
c9542f5f90 i2c: rcar: fix PM ref counts in probe error paths
ebd4f37ac1 i2c: npcm: Handle spurious interrupts
5c0dfca6b9 i2c: npcm: Correct register access width
06cb0f056b i2c: npcm: Fix timeout calculation
de6f6b5400 iommu/amd: Increase timeout waiting for GA log enablement
3cfb546439 dmaengine: stm32-mdma: fix chan initialization in stm32_mdma_irq_handler()
13d8d11dfa dmaengine: stm32-mdma: rework interrupt handler
0f87bd8b5f dmaengine: stm32-mdma: remove GISR1 register
c1c4405222 video: fbdev: clcdfb: Fix refcount leak in clcdfb_of_vram_setup
96fdbb1c85 NFSv4/pNFS: Do not fail I/O when we fail to allocate the pNFS layout
83839a333f NFS: Don't report errors from nfs_pageio_complete() more than once
040242365c NFS: Do not report flush errors in nfs_write_end()
c5a0e59bbe NFS: fsync() should report filesystem errors over EINTR/ERESTARTSYS
418b9fa434 NFS: Do not report EINTR/ERESTARTSYS as mapping errors
6073af7815 dmaengine: idxd: Fix the error handling path in idxd_cdev_register()
f57696bc63 i2c: at91: Initialize dma_buf in at91_twi_xfer()
8e49773a75 MIPS: Loongson: Use hwmon_device_register_with_groups() to register hwmon
ec5ded7acb cpufreq: mediatek: Unregister platform device on exit
9d91400fff cpufreq: mediatek: Use module_init and add module_exit
c7b0ec9744 cpufreq: mediatek: add missing platform_driver_unregister() on error in mtk_cpufreq_driver_init
fb02d6b543 i2c: at91: use dma safe buffers
da748d263a iommu/mediatek: Add list_del in mtk_iommu_remove
51d584704d f2fs: fix dereference of stale list iterator after loop body
0e0faa1431 OPP: call of_node_put() on error path in _bandwidth_supported()
baf86afed7 Input: stmfts - do not leave device disabled in stmfts_input_open
fc0750e659 RDMA/hfi1: Prevent use of lock before it is initialized
bb2220e067 mailbox: forward the hrtimer if not queued and under a lock
a1d4941d9a mfd: davinci_voicecodec: Fix possible null-ptr-deref davinci_vc_probe()
46fd994763 powerpc/fsl_rio: Fix refcount leak in fsl_rio_setup
b8ef79697b macintosh: via-pmu and via-cuda need RTC_LIB
cca915d691 powerpc/perf: Fix the threshold compare group constraint for power9
7620a280da powerpc/64: Only WARN if __pa()/__va() called with bad addresses
9b28515641 hwrng: omap3-rom - fix using wrong clk_disable() in omap_rom_rng_runtime_resume()
40d428b528 PCI/AER: Clear MULTI_ERR_COR/UNCOR_RCV bits
6e07ccc7d5 Input: sparcspkr - fix refcount leak in bbc_beep_probe
76badb0a4d crypto: cryptd - Protect per-CPU resource by disabling BH.
40c41a7bfd crypto: sun8i-ss - handle zero sized sg
5bea8f700a crypto: sun8i-ss - rework handling of IV
9834b13e8b tty: fix deadlock caused by calling printk() under tty_port->lock
a21d4dab77 PCI: imx6: Fix PERST# start-up sequence
2a9d3b5118 ipc/mqueue: use get_tree_nodev() in mqueue_get_tree()
f061ddfed9 proc: fix dentry/inode overinstantiating under /proc/${pid}/net
ab0c26e441 ASoC: atmel-classd: Remove endianness flag on class d component
b716e4168d ASoC: atmel-pdmic: Remove endianness flag on pdmic component
456105105e powerpc/4xx/cpm: Fix return value of __setup() handler
de5bc92318 powerpc/idle: Fix return value of __setup() handler
f991879762 pinctrl: renesas: core: Fix possible null-ptr-deref in sh_pfc_map_resources()
f7c290eac8 powerpc/8xx: export 'cpm_setbrg' for modules
49a5b1735c drivers/base/memory: fix an unlikely reference counting issue in __add_memory_block()
c121942917 dax: fix cache flush on PMD-mapped pages
d8a5bdc767 drivers/base/node.c: fix compaction sysfs file leak
84958f066d pinctrl: mvebu: Fix irq_of_parse_and_map() return value
8a8b40d007 nvdimm: Allow overwrite in the presence of disabled dimms
641649f31e nvdimm: Fix firmware activation deadlock scenarios
1052f22e12 firmware: arm_scmi: Fix list protocols enumeration in the base protocol
7a55a5159d scsi: fcoe: Fix Wstringop-overflow warnings in fcoe_wwn_from_mac()
17d9d7d264 mfd: ipaq-micro: Fix error check return value of platform_get_irq()
82c6c8a66c powerpc/fadump: fix PT_LOAD segment for boot memory area
08b053d32b arm: mediatek: select arch timer for mt7629
ceb61ab22d pinctrl: bcm2835: implement hook for missing gpio-ranges
cda45b715d gpiolib: of: Introduce hook for missing gpio-ranges
a26dfdf0a6 crypto: marvell/cesa - ECB does not IV
ee89d8dee5 misc: ocxl: fix possible double free in ocxl_file_register_afu
22c3fea20a ARM: dts: bcm2835-rpi-b: Fix GPIO line names
0a4ee6cdaa ARM: dts: bcm2837-rpi-3-b-plus: Fix GPIO line name of power LED
bd7ffc171c ARM: dts: bcm2837-rpi-cm3-io3: Fix GPIO line names for SMPS I2C
daffdb0830 ARM: dts: bcm2835-rpi-zero-w: Fix GPIO line name for Wifi/BT
95000ae680 ARM: dts: stm32: Fix PHY post-reset delay on Avenger96
b439f7addd can: xilinx_can: mark bit timing constants as const
875a17c3ad platform/chrome: Re-introduce cros_ec_cmd_xfer and use it for ioctls
b0bf87b1b3 ARM: dts: imx6dl-colibri: Fix I2C pinmuxing
acd2313bd9 platform/chrome: cros_ec: fix error handling in cros_ec_register()
e690350d3d KVM: nVMX: Clear IDT vectoring on nested VM-Exit for double/triple fault
fd7dca68a6 KVM: nVMX: Leave most VM-Exit info fields unmodified on failed VM-Entry
259c1fad9f soc: qcom: llcc: Add MODULE_DEVICE_TABLE()
ca7ce579a7 ARM: dts: ci4x10: Adapt to changes in imx6qdl.dtsi regarding fec clocks
acd99f384c PCI: dwc: Fix setting error return on MSI DMA mapping failure
92b7cab307 PCI: rockchip: Fix find_first_zero_bit() limit
266f5cf692 PCI: cadence: Fix find_first_zero_bit() limit
a409d0b1f9 soc: qcom: smsm: Fix missing of_node_put() in smsm_parse_ipc
7cbe94d296 soc: qcom: smp2p: Fix missing of_node_put() in smp2p_parse_ipc
8365341798 ARM: dts: suniv: F1C100: fix watchdog compatible
ea4f1c6bb9 memory: samsung: exynos5422-dmc: Avoid some over memory allocation
3960629bb5 arm64: dts: rockchip: Move drive-impedance-ohm to emmc phy on rk3399
0c5f04da02 net/smc: postpone sk_refcnt increment in connect()
8096e2d7c0 hinic: Avoid some over memory allocation
dc7753d600 net: huawei: hinic: Use devm_kcalloc() instead of devm_kzalloc()
4790963ef4 rxrpc: Fix decision on when to generate an IDLE ACK
3eef677a25 rxrpc: Don't let ack.previousPacket regress
573de88fc1 rxrpc: Fix overlapping ACK accounting
4f1c34ee60 rxrpc: Don't try to resend the request if we're receiving the reply
5b4826657d rxrpc: Fix listen() setting the bar too high for the prealloc rings
541224201e hv_netvsc: Fix potential dereference of NULL pointer
deb16df525 net: stmmac: fix out-of-bounds access in a selftest
5c2b34d072 net: stmmac: selftests: Use kcalloc() instead of kzalloc()
7386f69041 ASoC: max98090: Move check for invalid values before casting in max98090_put_enab_tlv()
d015f6f694 NFC: hci: fix sleep in atomic context bugs in nfc_hci_hcp_message_tx
7a5e6a4898 ASoC: wm2000: fix missing clk_disable_unprepare() on error in wm2000_anc_transition()
8bbf522a2c thermal/drivers/imx_sc_thermal: Fix refcount leak in imx_sc_thermal_probe
18530bedd2 thermal/core: Fix memory leak in __thermal_cooling_device_register()
dcf5ffc91c thermal/drivers/core: Use a char pointer for the cooling device name
79098339ac thermal/drivers/broadcom: Fix potential NULL dereference in sr_thermal_probe
8360380295 thermal/drivers/bcm2711: Don't clamp temperature at zero
3161044e75 drm/i915: Fix CFI violation with show_dynamic_id()
ffbcfb1688 drm/msm/dpu: handle pm_runtime_get_sync() errors in bind path
2679de7d04 x86/sev: Annotate stack change in the #VC handler
656aa3c51f drm: msm: fix possible memory leak in mdp5_crtc_cursor_set()
48e82ce8cd drm/msm/a6xx: Fix refcount leak in a6xx_gpu_init
d54ac6ca48 ext4: reject the 'commit' option on ext2 filesystems
63b7c08995 media: rkvdec: h264: Fix bit depth wrap in pps packet
b4805a77d5 media: rkvdec: h264: Fix dpb_valid implementation
82239e30ab media: staging: media: rkvdec: Make use of the helper function devm_platform_ioremap_resource()
5c24566294 media: ov7670: remove ov7670_power_off from ov7670_remove
510e879420 ASoC: ti: j721e-evm: Fix refcount leak in j721e_soc_probe_*
33411945c9 net: hinic: add missing destroy_workqueue in hinic_pf_to_mgmt_init
8113eedbab sctp: read sk->sk_bound_dev_if once in sctp_rcv()
6950ee32c1 lsm,selinux: pass flowi_common instead of flowi to the LSM hooks
a67a1661cf m68k: math-emu: Fix dependencies of math emulation support
4dcae15ff8 nvme: set dma alignment to dword
8ace1e6355 Bluetooth: use hdev lock for accept_list and reject_list in conn req
792f8b0e74 Bluetooth: use inclusive language when filtering devices
d763aa352c Bluetooth: use inclusive language in HCI role comments
c024f6f11d Bluetooth: LL privacy allow RPA
394df9f17e Bluetooth: L2CAP: Rudimentary typo fixes
5702c3c657 Bluetooth: Interleave with allowlist scan
36c644c63b Bluetooth: fix dangling sco_conn and use-after-free in sco_sock_timeout
fc68385fcb media: vsp1: Fix offset calculation for plane cropping
a3304766d9 media: pvrusb2: fix array-index-out-of-bounds in pvr2_i2c_core_init
7d792640d3 media: exynos4-is: Change clk_disable to clk_disable_unprepare
b3e4837358 media: st-delta: Fix PM disable depth imbalance in delta_probe
8e4e0c4ac5 media: exynos4-is: Fix PM disable depth imbalance in fimc_is_probe
0572a5bd38 media: aspeed: Fix an error handling path in aspeed_video_probe()
34feaea3aa scripts/faddr2line: Fix overlapping text section failures
1472fb1c74 kselftest/cgroup: fix test_stress.sh to use OUTPUT dir
cacea459f9 ASoC: samsung: Fix refcount leak in aries_audio_probe
c1b08aa568 ASoC: samsung: Use dev_err_probe() helper
9f564e29a5 regulator: pfuze100: Fix refcount leak in pfuze_parse_regulators_dt
2a0da7641e ASoC: mxs-saif: Fix refcount leak in mxs_saif_probe
e84aaf23ca ASoC: fsl: Fix refcount leak in imx_sgtl5000_probe
4024affd53 ath11k: Don't check arvif->is_started before sending management frames
779d41c80b perf/amd/ibs: Use interrupt regs ip for stack unwinding
37a9db0ee7 regulator: qcom_smd: Fix up PM8950 regulator configuration
e2786db0a7 Revert "cpufreq: Fix possible race in cpufreq online error path"
560dcbe1c7 spi: spi-fsl-qspi: check return value after calling platform_get_resource_byname()
f40549ce20 iomap: iomap_write_failed fix
7a79ab2596 media: uvcvideo: Fix missing check to determine if element is found in list
d50b26221f drm/msm: return an error pointer in msm_gem_prime_get_sg_table()
883f1d52a5 drm/msm/mdp5: Return error code in mdp5_mixer_release when deadlock is detected
49dc28b4b2 drm/msm/mdp5: Return error code in mdp5_pipe_release when deadlock is detected
a10092daba drm/msm/dp: fix event thread stuck in wait_event after kthread_stop()
369a712442 regulator: core: Fix enable_count imbalance with EXCLUSIVE_GET
018ebe4c18 arm64: fix types in copy_highpage()
49bfbaf6a0 x86/mm: Cleanup the control_va_addr_alignment() __setup handler
0d5c8ac922 irqchip/aspeed-scu-ic: Fix irq_of_parse_and_map() return value
f4b503b4ef irqchip/aspeed-i2c-ic: Fix irq_of_parse_and_map() return value
5e76e51633 irqchip/exiu: Fix acknowledgment of edge triggered interrupts
35abf2081f x86: Fix return value of __setup handlers
940b12435b virtio_blk: fix the discard_granularity and discard_alignment queue limits
23716d7614 perf tools: Use Python devtools for version autodetection rather than runtime
3451852312 drm/rockchip: vop: fix possible null-ptr-deref in vop_bind()
e19ece6f24 drm/panel: panel-simple: Fix proper bpc for AM-1280800N3TZQW-T00H
5a26a49470 drm/msm: add missing include to msm_drv.c
7b815e91ff drm/msm/hdmi: fix error check return value of irq_of_parse_and_map()
d9cb951d11 drm/msm/hdmi: check return value after calling platform_get_resource_byname()
e99755e6a9 drm/msm/dsi: fix error checks and return values for DSI xmit functions
3574e0b290 drm/msm/dp: fix error check return value of irq_of_parse_and_map()
04204612dd drm/msm/dp: stop event kernel thread when DP unbind
134760263f drm/msm/disp/dpu1: set vbif hw config to NULL to avoid use after memory free during pm runtime resume
d5773db56c perf tools: Add missing headers needed by util/data.h
e251a33fe8 ASoC: rk3328: fix disabling mclk on pclk probe failure
e2fef34d78 x86/speculation: Add missing prototype for unpriv_ebpf_notify()
81f1ddffdc mtd: rawnand: cadence: fix possible null-ptr-deref in cadence_nand_dt_probe()
b6ecf2b7e6 x86/pm: Fix false positive kmemleak report in msr_build_context()
0e1cd4edef mtd: spi-nor: core: Check written SR value in spi_nor_write_16bit_sr_and_check()
ab88c8d906 libbpf: Fix logic for finding matching program for CO-RE relocation
97b56f17b3 selftests/resctrl: Fix null pointer dereference on open failed
c54d66c514 scsi: ufs: core: Exclude UECxx from SFR dump list
02192ee936 scsi: ufs: qcom: Fix ufs_qcom_resume()
328cfeac73 drm/msm/dpu: adjust display_v_end for eDP and DP
cc68e53f9a of: overlay: do not break notify on NOTIFY_{OK|STOP}
f929416d5c fsnotify: fix wrong lockdep annotations
94845fc422 inotify: show inotify mask flags in proc fdinfo
f2c68c5289 ALSA: pcm: Check for null pointer of pointer substream before dereferencing it
d764a7d647 drm/panel: simple: Add missing bus flags for Innolux G070Y2-L01
b6b70cd3dd media: hantro: Empty encoder capture buffers by default
461e4c1f19 ath9k_htc: fix potential out of bounds access with invalid rxstatus->rs_keyix
96c848afbd cpufreq: Fix possible race in cpufreq online error path
172789fd95 spi: img-spfi: Fix pm_runtime_get_sync() error checking
147a376c1a sched/fair: Fix cfs_rq_clock_pelt() for throttled cfs_rq
f35c3f2374 drm/bridge: Fix error handling in analogix_dp_probe
6d0726725c HID: elan: Fix potential double free in elan_input_configured
39d4bd3f59 HID: hid-led: fix maximum brightness for Dream Cheeky
3c68daf4a3 mtd: rawnand: denali: Use managed device resources
dd2b1d70ef EDAC/dmc520: Don't print an error for each unconfigured interrupt line
bea6985099 drbd: fix duplicate array initializer
3eba802d47 target: remove an incorrect unmap zeroes data deduction
e7681199bb efi: Add missing prototype for efi_capsule_setup_info
2a1b5110c9 NFC: NULL out the dev->rfkill to prevent UAF
8e357f086d net: dsa: mt7530: 1G can also support 1000BASE-X link mode
4565d5be8b scftorture: Fix distribution of short handler delays
58eff5b73f spi: spi-ti-qspi: Fix return value handling of wait_for_completion_timeout
b4c7dd0037 drm: mali-dp: potential dereference of null pointer
78a3e9fcdb drm/komeda: Fix an undefined behavior bug in komeda_plane_add()
3cea0259ed nl80211: show SSID for P2P_GO interfaces
6c0a8c771a bpf: Fix excessive memory allocation in stack_map_alloc()
7ff76dc2d8 libbpf: Don't error out on CO-RE relos for overriden weak subprogs
84b0e23e10 drm/vc4: txp: Force alpha to be 0xff if it's disabled
ac904216b8 drm/vc4: txp: Don't set TXP_VSTART_AT_EOF
15cec7dfd3 drm/vc4: hvs: Reset muxes at probe time
2268f190af drm/mediatek: Fix mtk_cec_mask()
032f8c67fe drm/ingenic: Reset pixclock rate when parent clock rate changes
58c7c01577 x86/delay: Fix the wrong asm constraint in delay_loop()
f279c49f17 ASoC: mediatek: Fix missing of_node_put in mt2701_wm8960_machine_probe
fb66e0512e ASoC: mediatek: Fix error handling in mt8173_max98090_dev_probe
35db6e2e99 spi: qcom-qspi: Add minItems to interconnect-names
187ecfc3b7 drm/bridge: adv7511: clean up CEC adapter when probe fails
9072d62785 drm/edid: fix invalid EDID extension block filtering
0d6dc3efb1 ath9k: fix ar9003_get_eepmisc
822dac24b4 ath11k: acquire ab->base_lock in unassign when finding the peer by addr
3ed327b77d dt-bindings: display: sitronix, st7735r: Fix backlight in example
61bbbde9b6 drm: fix EDID struct for old ARM OABI format
cc80d3c37c RDMA/hfi1: Prevent panic when SDMA is disabled
dfc308d6f2 powerpc/iommu: Add missing of_node_put in iommu_init_early_dart
b4e14e9beb macintosh/via-pmu: Fix build failure when CONFIG_INPUT is disabled
0230055fa6 powerpc/powernv: fix missing of_node_put in uv_init()
6a61a97106 powerpc/xics: fix refcount leak in icp_opal_init()
8a665c2791 powerpc/powernv/vas: Assign real address to rx_fifo in vas_rx_win_attr
5a3767ac79 tracing: incorrect isolate_mote_t cast in mm_vmscan_lru_isolate
eff3587b9c PCI: Avoid pci_dev_lock() AB/BA deadlock with sriov_numvfs_store()
21a3effe44 ARM: hisi: Add missing of_node_put after of_find_compatible_node
d2b3b380c1 ARM: dts: exynos: add atmel,24c128 fallback to Samsung EEPROM
d146e2a986 ARM: versatile: Add missing of_node_put in dcscb_init
b646e0cfeb pinctrl: renesas: rzn1: Fix possible null-ptr-deref in sh_pfc_map_resources()
c16f1b3d72 fat: add ratelimit to fat*_ent_bread()
f20c7cd2b2 powerpc/fadump: Fix fadump to work with a different endian capture kernel
039966775c ARM: OMAP1: clock: Fix UART rate reporting algorithm
9dfa8d087b fs: jfs: fix possible NULL pointer dereference in dbFree()
05efc4591f soc: ti: ti_sci_pm_domains: Check for null return of devm_kcalloc
0f9091f202 crypto: ccree - use fine grained DMA mapping dir
86b091b689 PM / devfreq: rk3399_dmc: Disable edev on remove()
7e391ec939 arm64: dts: qcom: msm8994: Fix BLSP[12]_DMA channels count
c400439adc ARM: dts: s5pv210: align DMA channels with dtschema
0521c52978 ARM: dts: ox820: align interrupt controller node name with dtschema
968a668376 IB/rdmavt: add missing locks in rvt_ruc_loopback
6a2e275834 gfs2: use i_lock spin_lock for inode qadata
92ef7a8719 selftests/bpf: fix btf_dump/btf_dump due to recent clang change
340cf91293 eth: tg3: silence the GCC 12 array-bounds warning
cb2ca93f8f rxrpc, afs: Fix selection of abort codes
4a4e2e90ec rxrpc: Return an error to sendmsg if call failed
6c18a0fcd6 m68k: atari: Make Atari ROM port I/O write macros return void
76744a016e x86/microcode: Add explicit CPU vendor dependency
f29fb46232 can: mcp251xfd: silence clang's -Wunaligned-access warning
ff383c1879 ASoC: rt1015p: remove dependency on GPIOLIB
c73aee1946 ASoC: max98357a: remove dependency on GPIOLIB
86c02171bd media: exynos4-is: Fix compile warning
abb5594ae2 net: phy: micrel: Allow probing without .driver_data
8d33585ffa nbd: Fix hung on disconnect request if socket is closed before
1a5a3dfd9f ASoC: rt5645: Fix errorenous cleanup order
af98940dd3 nvme-pci: fix a NULL pointer dereference in nvme_alloc_admin_tags
8671aeeef2 openrisc: start CPU timer early in boot
22cdbb1354 media: cec-adap.c: fix is_configuring state
4cf6ba9367 media: imon: reorganize serialization
f3915b4665 media: coda: limit frame interval enumeration to supported encoder frame sizes
8ddc89437c media: rga: fix possible memory leak in rga_probe
f9413b9023 rtlwifi: Use pr_warn instead of WARN_ONCE
eb7a71b7b2 ipmi: Fix pr_fmt to avoid compilation issues
fa390c8b62 ipmi:ssif: Check for NULL msg when handling events and messages
0b7c1dc7ee ACPI: PM: Block ASUS B1400CEAE from suspend to idle by default
1ecd01d77c dma-debug: change allocation mode from GFP_NOWAIT to GFP_ATIOMIC
a61583744e spi: stm32-qspi: Fix wait_cmd timeout in APM mode
0c05c03c51 perf/amd/ibs: Cascade pmu init functions' return value
4605458398 s390/preempt: disable __preempt_count_add() optimization for PROFILE_ALL_BRANCHES
312c43e98e net: remove two BUG() from skb_checksum_help()
4f99bde59e ASoC: tscs454: Add endianness flag in snd_soc_component_driver
296f8ca0f7 HID: bigben: fix slab-out-of-bounds Write in bigben_probe
3ee67465f7 drm/amdgpu/ucode: Remove firmware load type check in amdgpu_ucode_free_bo
6f19abe031 mlxsw: Treat LLDP packets as control
b30e727f09 mlxsw: spectrum_dcb: Do not warn about priority changes
d68a5eb7b3 ASoC: dapm: Don't fold register value changes into notifications
9b42659cb3 net/mlx5: fs, delete the FTE when there are no rules attached to it
4d85201adb ipv6: Don't send rs packets to the interface of ARPHRD_TUNNEL
0325c08ae2 drm: msm: fix error check return value of irq_of_parse_and_map()
ad97425d23 arm64: compat: Do not treat syscall number as ESR_ELx for a bad syscall
8aa3750986 ath10k: skip ath10k_halt during suspend for driver state RESTARTING
20ad91d08a drm/amd/pm: fix the compile warning
b5cd108143 drm/plane: Move range check for format_count earlier
8c3fe9ff80 ASoC: Intel: bytcr_rt5640: Add quirk for the HP Pro Tablet 408
60afa4f4e1 ath11k: disable spectral scan during spectral deinit
fa1b509d41 scsi: lpfc: Fix resource leak in lpfc_sli4_send_seq_to_ulp()
1869f9bfaf scsi: ufs: Use pm_runtime_resume_and_get() instead of pm_runtime_get_sync()
508add11af scsi: megaraid: Fix error check return value of register_chrdev()
95050b9847 drivers: mmc: sdhci_am654: Add the quirk to set TESTCD bit
90281cadf5 mmc: jz4740: Apply DMA engine limits to maximum segment size
e69e93120f md/bitmap: don't set sb values if can't pass sanity check
3f94169aff media: cx25821: Fix the warning when removing the module
ca17e7a532 media: pci: cx23885: Fix the error handling in cx23885_initdev()
27ad46da44 media: venus: hfi: avoid null dereference in deinit
e68270a786 ath9k: fix QCA9561 PA bias level
ca1ce20689 drm/amd/pm: fix double free in si_parse_power_table()
3102e9d7e5 tools/power turbostat: fix ICX DRAM power numbers
fbfeb9bc94 spi: spi-rspi: Remove setting {src,dst}_{addr,addr_width} based on DMA direction
e2b8681769 ALSA: jack: Access input_dev under mutex
005990e30d sfc: ef10: Fix assigning negative value to unsigned variable
10f30cba8f rcu: Make TASKS_RUDE_RCU select IRQ_WORK
1c6c3f2336 rcu-tasks: Fix race in schedule and flush work
c977d63b8c drm/komeda: return early if drm_universal_plane_init() fails.
cd97a481ea ACPICA: Avoid cache flush inside virtual machines
29cb802966 x86/platform/uv: Update TSC sync state for UV5
59dd1a07ee fbcon: Consistently protect deferred_takeover with console_lock()
5bfb65e92f ipv6: fix locking issues with loops over idev->addr_list
98d1dc32f8 ipw2x00: Fix potential NULL dereference in libipw_xmit()
cc575b8558 b43: Fix assigning negative value to unsigned variable
4ae5a2ccf5 b43legacy: Fix assigning negative value to unsigned variable
74ad0d7450 mwifiex: add mutex lock for call in mwifiex_dfs_chan_sw_work_queue
fadc626cae drm/virtio: fix NULL pointer dereference in virtio_gpu_conn_get_modes
c6380d9d2d iommu/vt-d: Add RPLS to quirk list to skip TE disabling
509e9710b8 btrfs: repair super block num_devices automatically
4093eea47d btrfs: add "0x" prefix for unsupported optional features
b49516583f ptrace: Reimplement PTRACE_KILL by always sending SIGKILL
f8ef79687b ptrace/xtensa: Replace PT_SINGLESTEP with TIF_SINGLESTEP
6580673b17 ptrace/um: Replace PT_DTRACE with TIF_SINGLESTEP
92fb46536a perf/x86/intel: Fix event constraints for ICL
b4acb8e7f1 x86/MCE/AMD: Fix memory leak when threshold_create_bank() fails
860e44f21f parisc/stifb: Keep track of hardware path of graphics card
78e008dca2 Fonts: Make font size unsigned in font_desc
c5b9b7fb12 xhci: Allow host runtime PM as default for Intel Alder Lake N xHCI
c9ac773715 cifs: when extending a file with falloc we should make files not-sparse
ce4627f09e usb: core: hcd: Add support for deferring roothub registration
a2532c4417 usb: dwc3: gadget: Move null pinter check to proper place
0420275d64 USB: new quirk for Dell Gen 2 devices
19b3fe8a7c USB: serial: option: add Quectel BG95 modem
40bdb5ec95 ALSA: usb-audio: Cancel pending work at closing a MIDI substream
1cf70d5c15 ALSA: hda/realtek - Fix microphone noise on ASUS TUF B550M-PLUS
223368eaf6 ALSA: hda/realtek: Enable 4-speaker output for Dell XPS 15 9520 laptop
d2f3acde3d riscv: Fix irq_work when SMP is disabled
4a5c7a61ff riscv: Initialize thread pointer before calling C functions
6b45437959 parisc/stifb: Implement fb_is_primary_device()
9cef71ecea binfmt_flat: do not stop relocating GOT entries prematurely on riscv
43ca8e1dfb Merge 5.10.118 into android12-5.10-lts
70dd2d169d Linux 5.10.120
886eeb0460 bpf: Enlarge offset check value to INT_MAX in bpf_skb_{load,store}_bytes
7f845de286 bpf: Fix potential array overflow in bpf_trampoline_get_progs()
3097f38e91 NFSD: Fix possible sleep during nfsd4_release_lockowner()
78a62e09d8 NFS: Memory allocation failures are not server fatal errors
1d100fcc1d docs: submitting-patches: Fix crossref to 'The canonical patch format'
ebbbffae71 tpm: ibmvtpm: Correct the return value in tpm_ibmvtpm_probe()
5933a191ac tpm: Fix buffer access in tpm2_get_tpm_pt()
0c56e5d0e6 HID: multitouch: add quirks to enable Lenovo X12 trackpoint
d6822d82c0 HID: multitouch: Add support for Google Whiskers Touchpad
0f03885059 raid5: introduce MD_BROKEN
8df42bcd36 dm verity: set DM_TARGET_IMMUTABLE feature flag
e39b536d70 dm stats: add cond_resched when looping over entries
4617778417 dm crypt: make printing of the key constant-time
bb64957c47 dm integrity: fix error code in dm_integrity_ctr()
8845027e55 ARM: dts: s5pv210: Correct interrupt name for bluetooth in Aries
4989bb0334 Bluetooth: hci_qca: Use del_timer_sync() before freeing
fae05b2314 zsmalloc: fix races between asynchronous zspage free and page migration
6a1cc25494 crypto: ecrdsa - Fix incorrect use of vli_cmp
c013f7d1cd crypto: caam - fix i.MX6SX entropy delay value
3d8fc6e28f KVM: x86: avoid calling x86 emulator without a decoded instruction
a2a3fa5b61 x86, kvm: use correct GFP flags for preemption disabled
4a9f3a9c28 x86/kvm: Alloc dummy async #PF token outside of raw spinlock
4c4a11c74a KVM: PPC: Book3S HV: fix incorrect NULL check on list iterator
91a36ec160 netfilter: conntrack: re-fetch conntrack after insertion
c0aff1faf6 netfilter: nf_tables: sanitize nft_set_desc_concat_parse()
44f1ce5530 crypto: drbg - make reseeding from get_random_bytes() synchronous
e744e34a3c crypto: drbg - move dynamic ->reseed_threshold adjustments to __drbg_seed()
54700e82a7 crypto: drbg - track whether DRBG was seeded with !rng_is_initialized()
b2bef5500e crypto: drbg - prepare for more fine-grained tracking of seeding state
630192aa45 lib/crypto: add prompts back to crypto libraries
82f723b8a5 exfat: check if cluster num is valid
1f0681f3bd drm/i915: Fix -Wstringop-overflow warning in call to intel_read_wm_latency()
2728d95c6c xfs: Fix CIL throttle hang when CIL space used going backwards
a9e7f19a55 xfs: fix an ABBA deadlock in xfs_rename
72464fd2b4 xfs: fix the forward progress assertion in xfs_iwalk_run_callbacks
45d97f70da xfs: show the proper user quota options
f20e67b455 xfs: detect overflows in bmbt records
ffc8d61387 net: ipa: compute proper aggregation limit
8adb751d29 io_uring: fix using under-expanded iters
57d01bcae7 io_uring: don't re-import iovecs from callbacks
6029f86740 assoc_array: Fix BUG_ON during garbage collect
b96b4aa65b cfg80211: set custom regdomain after wiphy registration
8fbd54ab06 pipe: Fix missing lock in pipe_resize_ring()
cd720fad8b pipe: make poll_usage boolean and annotate its access
ea62d169b6 netfilter: nf_tables: disallow non-stateful expression in sets earlier
5525af175b drivers: i2c: thunderx: Allow driver to work with ACPI defined TWSI controllers
f0749aecb2 i2c: ismt: Provide a DMA buffer for Interrupt Cause Logging
828309eee5 net: ftgmac100: Disable hardware checksum on AST2600
640397afdf nfc: pn533: Fix buggy cleanup order
ac8d5eb26c net: af_key: check encryption module availability consistency
d007f49ab7 percpu_ref_init(): clean ->percpu_count_ref on failure
75e35951d6 pinctrl: sunxi: fix f1c100s uart2 function
56c31ac1d8 Linux 5.10.119
7c57f21349 ALSA: ctxfi: Add SB046x PCI ID
514f587340 random: check for signals after page of pool writes
18c261e948 random: wire up fops->splice_{read,write}_iter()
cf8f8d3758 random: convert to using fops->write_iter()
affa1ae522 random: convert to using fops->read_iter()
4bb374a118 random: unify batched entropy implementations
552ae8e484 random: move randomize_page() into mm where it belongs
5f2a040b2f random: move initialization functions out of hot pages
02102b63bd random: make consistent use of buf and len
33783ca355 random: use proper return types on get_random_{int,long}_wait()
1fdd7eef21 random: remove extern from functions in header
811afd06e0 random: use static branch for crng_ready()
04d61b96bd random: credit architectural init the exact amount
5123cc61e2 random: handle latent entropy and command line from random_init()
9320e087f2 random: use proper jiffies comparison macro
31ac294037 random: remove ratelimiting for in-kernel unseeded randomness
b50f2830b3 random: move initialization out of reseeding hot path
4c4110c052 random: avoid initializing twice in credit race
cef9010b78 random: use symbolic constants for crng_init states
30e9f36266 siphash: use one source of truth for siphash permutations
772edeb8c7 random: help compiler out with fast_mix() by using simpler arguments
1841347233 random: do not use input pool from hard IRQs
999b0c9e8a random: order timer entropy functions below interrupt functions
ce3c4ff381 random: do not pretend to handle premature next security model
24d3275685 random: use first 128 bits of input as fast init
273aebb50b random: do not use batches when !crng_ready()
f4c98fe1d1 random: insist on random_get_entropy() existing in order to simplify
ffcfdd5de9 xtensa: use fallback for random_get_entropy() instead of zero
e1ea0e26d3 sparc: use fallback for random_get_entropy() instead of zero
a5092be129 um: use fallback for random_get_entropy() instead of zero
25d4fdf1f0 x86/tsc: Use fallback for random_get_entropy() instead of zero
0b93f40cbe nios2: use fallback for random_get_entropy() instead of zero
fdca775081 arm: use fallback for random_get_entropy() instead of zero
d5531246af mips: use fallback for random_get_entropy() instead of just c0 random
714def4497 riscv: use fallback for random_get_entropy() instead of zero
84397906a6 m68k: use fallback for random_get_entropy() instead of zero
7690be1adf timekeeping: Add raw clock fallback for random_get_entropy()
07b5d0b3e2 powerpc: define get_cycles macro for arch-override
30ee01bcdc alpha: define get_cycles macro for arch-override
c55a863c30 parisc: define get_cycles macro for arch-override
641d1fbd96 s390: define get_cycles macro for arch-override
c895438b17 ia64: define get_cycles macro for arch-override
7d9eab78be init: call time_init() before rand_initialize()
ec25e386d3 random: fix sysctl documentation nits
9dff512945 random: document crng_fast_key_erasure() destination possibility
a1b5c849d8 random: make random_get_entropy() return an unsigned long
72a9ec8d75 random: allow partial reads if later user copies fail
1805d20dfb random: check for signals every PAGE_SIZE chunk of /dev/[u]random
9641d9b430 random: check for signal_pending() outside of need_resched() check
26ee8fa4df random: do not allow user to keep crng key around on stack
bb515a5bef random: do not split fast init input in add_hwgenerator_randomness()
be0d4e3e96 random: mix build-time latent entropy into pool at init
bb563d06c5 random: re-add removed comment about get_random_{u32,u64} reseeding
f3bc5eca83 random: treat bootloader trust toggle the same way as cpu trust toggle
7cb6782146 random: skip fast_init if hwrng provides large chunk of entropy
083ab33951 random: check for signal and try earlier when generating entropy
20da9c6079 random: reseed more often immediately after booting
9891211dfe random: make consistent usage of crng_ready()
95a1c94a1b random: use SipHash as interrupt entropy accumulator
849e7b744c random: replace custom notifier chain with standard one
66307429b5 random: don't let 644 read-only sysctls be written to
4c74ca006a random: give sysctl_random_min_urandom_seed a more sensible value
0964a76fd5 random: do crng pre-init loading in worker rather than irq
192d4c6cb3 random: unify cycles_t and jiffies usage and types
47f0e89b71 random: cleanup UUID handling
9b0e0e2714 random: only wake up writers after zap if threshold was passed
c47f215ab3 random: round-robin registers as ulong, not u32
5064550d42 random: clear fast pool, crng, and batches in cpuhp bring up
6e1cb84cc6 random: pull add_hwgenerator_randomness() declaration into random.h
32252548b5 random: check for crng_init == 0 in add_device_randomness()
684e9fe92d random: unify early init crng load accounting
f656bd0011 random: do not take pool spinlock at boot
5d73e69a5d random: defer fast pool mixing to worker
7873321cd8 random: rewrite header introductory comment
6d1671b6d2 random: group sysctl functions
21ae543e3a random: group userspace read/write functions
f04580811d random: group entropy collection functions
e9ff357860 random: group entropy extraction functions
d7e5b1925a random: group crng functions
6b1ffb3b5a random: group initialization wait functions
6c9cee1555 random: remove whitespace and reorder includes
7b0f36f7c2 random: remove useless header comment
b390181654 random: introduce drain_entropy() helper to declutter crng_reseed()
0971c1c2fd random: deobfuscate irq u32/u64 contributions
ae1b8f1954 random: add proper SPDX header
9342656c01 random: remove unused tracepoints
17ad693cd2 random: remove ifdef'd out interrupt bench
28683a1885 random: tie batched entropy generation to base_crng generation
adc32acf23 random: fix locking for crng_init in crng_reseed()
bb63851c25 random: zero buffer after reading entropy from userspace
63c1aae40a random: remove outdated INT_MAX >> 6 check in urandom_read()
07280d2c3f random: make more consistent use of integer types
655a69cb41 random: use hash function for crng_slow_load()
95026060d8 random: use simpler fast key erasure flow on per-cpu keys
732872aa2c random: absorb fast pool into input pool after fast load
7a5b9ca583 random: do not xor RDRAND when writing into /dev/random
16a6e4ae71 random: ensure early RDSEED goes through mixer on init
c521bf08ee random: inline leaves of rand_initialize()
70377ee074 random: get rid of secondary crngs
c36e71b5a5 random: use RDSEED instead of RDRAND in entropy extraction
1d1582e5fe random: fix locking in crng_fast_load()
0762b7d1f1 random: remove batched entropy locking
8d07e2a226 random: remove use_input_pool parameter from crng_reseed()
b07fcd9e53 random: make credit_entropy_bits() always safe
32d1d7ce3a random: always wake up entropy writers after extraction
9852922061 random: use linear min-entropy accumulation crediting
bb9c45cfb9 random: simplify entropy debiting
de0727c0c4 random: use computational hash for entropy extraction
e0cc561e47 random: only call crng_finalize_init() for primary_crng
480fd91dcd random: access primary_pool directly rather than through pointer
0b9e36e895 random: continually use hwgenerator randomness
6d2d29f051 random: simplify arithmetic function flow in account()
a0653a9ec1 random: selectively clang-format where it makes sense
bccc8d9231 random: access input_pool_data directly rather than through pointer
a9db850c21 random: cleanup fractional entropy shift constants
edd294052e random: prepend remaining pool constants with POOL_
f87f50b843 random: de-duplicate INPUT_POOL constants
09ae6b8519 random: remove unused OUTPUT_POOL constants
8cc5260c19 random: rather than entropy_store abstraction, use global
5897e06ac1 random: remove unused extract_entropy() reserved argument
ae093ca125 random: remove incomplete last_data logic
7abbc9809f random: cleanup integer types
c9e108e36d random: cleanup poolinfo abstraction
8a3b78f917 random: fix typo in comments
0ad5d6384d random: don't reset crng_init_cnt on urandom_read()
17420c77f0 random: avoid superfluous call to RDRAND in CRNG extraction
c245231aec random: early initialization of ChaCha constants
efaddd56bc random: use IS_ENABLED(CONFIG_NUMA) instead of ifdefs
6443204102 random: harmonize "crng init done" messages
ca57d51126 random: mix bootloader randomness into pool
542d8ebedb random: do not re-init if crng_reseed completes before primary init
2bfdf588a8 random: do not sign extend bytes for rotation when mixing
685200b076 random: use BLAKE2s instead of SHA1 in extraction
33c30bfe4f random: remove unused irq_flags argument from add_interrupt_randomness()
b57a888740 random: document add_hwgenerator_randomness() with other input functions
ae33c501e0 lib/crypto: blake2s: avoid indirect calls to compression function for Clang CFI
07918ddba3 lib/crypto: sha1: re-roll loops to reduce code size
5fb6a3ba3a lib/crypto: blake2s: move hmac construction into wireguard
62531d446a lib/crypto: blake2s: include as built-in
aec0878b1d crypto: blake2s - include <linux/bug.h> instead of <asm/bug.h>
030d3443aa crypto: blake2s - adjust include guard naming
fea91e9070 crypto: blake2s - add comment for blake2s_state fields
d45ae768b7 crypto: blake2s - optimize blake2s initialization
6c362b7c77 crypto: blake2s - share the "shash" API boilerplate code
72e5b68f33 crypto: blake2s - move update and final logic to internal/blake2s.h
e467a55bd0 crypto: blake2s - remove unneeded includes
198a19d7ee crypto: x86/blake2s - define shash_alg structs using macros
89f9ee998e crypto: blake2s - define shash_alg structs using macros
0f8fcf5b6e crypto: lib/blake2s - Move selftest prototype into header file
c3a4645d80 MAINTAINERS: add git tree for random.c
c4882c6e1e MAINTAINERS: co-maintain random.c
acb198c4d1 random: remove dead code left over from blocking pool
6227458fef random: avoid arch_get_random_seed_long() when collecting IRQ randomness
257fbea15a ACPI: sysfs: Fix BERT error region memory mapping
14fa2769ea ACPI: sysfs: Make sparse happy about address space in use
0debc69f00 media: vim2m: initialize the media device earlier
ed0e71cc3f media: vim2m: Register video device after setting up internals
a5c68f457f secure_seq: use the 64 bits of the siphash for port offset calculation
33f1b4a27a tcp: change source port randomizarion at connect() time
9b4aa0d80b KVM: x86/mmu: fix NULL pointer dereference on guest INVPCID
74c6e5d584 KVM: x86: Properly handle APF vs disabled LAPIC situation
c06e5f751a staging: rtl8723bs: prevent ->Ssid overflow in rtw_wx_set_scan()
a8f4d63142 lockdown: also lock down previous kgdb use
c204ee3350 Linux 5.10.118
56642f6af2 module: check for exit sections in layout_sections() instead of module_init_section()
633be494c3 include/uapi/linux/xfrm.h: Fix XFRM_MSG_MAPPING ABI breakage
61a4cc41e5 afs: Fix afs_getattr() to refetch file status if callback break occurred
606011cb6a i2c: mt7621: fix missing clk_disable_unprepare() on error in mtk_i2c_probe()
030de84d45 module: treat exit sections the same as init sections when !CONFIG_MODULE_UNLOAD
355141fdbf dt-bindings: pinctrl: aspeed-g6: remove FWQSPID group
d30fdf7d13 Input: ili210x - fix reset timing
a698bf1f72 arm64: Enable repeat tlbi workaround on KRYO4XX gold CPUs
696292b9b5 net: atlantic: verify hw_head_ lies within TX buffer ring
cd66ab20a8 net: atlantic: add check for MAX_SKB_FRAGS
9bee8b4275 net: atlantic: reduce scope of is_rsc_complete
9b84e83a92 net: atlantic: fix "frag[0] not initialized"
0ae23a1d47 net: stmmac: fix missing pci_disable_device() on error in stmmac_pci_probe()
d4c6e5cebc ethernet: tulip: fix missing pci_disable_device() on error in tulip_init_one()
3a6dee284f nl80211: fix locking in nl80211_set_tx_bitrate_mask()
efe580c436 selftests: add ping test with ping_group_range tuned
1cfbf6d3a7 nl80211: validate S1G channel width
a0f5ff2049 mac80211: fix rx reordering with non explicit / psmp ack policy
e21d734fd0 scsi: qla2xxx: Fix missed DMA unmap for aborted commands
c5af341747 perf bench numa: Address compiler error on s390
210ea7da5c gpio: mvebu/pwm: Refuse requests with inverted polarity
30d4721fec gpio: gpio-vf610: do not touch other bits when set the target bit
ea8a9cb4a7 riscv: dts: sifive: fu540-c000: align dma node name with dtschema
dfd1f0cb62 net: bridge: Clear offload_fwd_mark when passing frame up bridge interface.
579061f391 igb: skip phy status check where unavailable
a89888648e ARM: 9197/1: spectre-bhb: fix loop8 sequence for Thumb2
1756b45d8d ARM: 9196/1: spectre-bhb: enable for Cortex-A15
7b676abe32 net: af_key: add check for pfkey_broadcast in function pfkey_process
697f3219ee net/mlx5e: Properly block LRO when XDP is enabled
b503d0228c NFC: nci: fix sleep in atomic context bugs caused by nci_skb_alloc
42d4287cc1 net/qla3xxx: Fix a test in ql_reset_work()
d35bf8d766 clk: at91: generated: consider range when calculating best rate
9e0e75a5e7 ice: fix possible under reporting of ethtool Tx and Rx statistics
6e2caee5cd net: vmxnet3: fix possible NULL pointer dereference in vmxnet3_rq_cleanup()
a54d86cf41 net: vmxnet3: fix possible use-after-free bugs in vmxnet3_rq_alloc_rx_buf()
201e5b5c27 net: systemport: Fix an error handling path in bcm_sysport_probe()
9bfe898e2b net/sched: act_pedit: sanitize shift argument before usage
47f04f95ed xfrm: fix "disable_policy" flag use when arriving from different devices
0d2e9d8000 xfrm: rework default policy structure
57c1bbe709 xfrm: fix dflt policy check when there is no policy configured
9856c3a129 xfrm: notify default policy on update
20fd28df40 xfrm: make user policy API complete
ab610ee1d1 net: xfrm: fix shift-out-of-bounce
5b7f84b1f9 xfrm: Add possibility to set the default to block if we have no policy
243e72e204 net: evaluate net.ipvX.conf.all.disable_policy and disable_xfrm
1bc27eb71b net: macb: Increment rx bd head after allocating skb and buffer
998e305bd1 net: ipa: record proper RX transaction count
0599d5a8b4 ARM: dts: aspeed-g6: fix SPI1/SPI2 quad pin group
0a2847d448 pinctrl: pinctrl-aspeed-g6: remove FWQSPID group in pinctrl
d8ca684c3d ARM: dts: aspeed-g6: remove FWQSPID group in pinctrl dtsi
3fc2846099 dma-buf: fix use of DMA_BUF_SET_NAME_{A,B} in userspace
e5289affba drm/dp/mst: fix a possible memory leak in fetch_monitor_name()
8ceca1a069 libceph: fix potential use-after-free on linger ping and resends
233a3cc60e crypto: qcom-rng - fix infinite loop on requests not multiple of WORD_SZ
6013ef5f51 arm64: mte: Ensure the cleared tags are visible before setting the PTE
a817f78ed6 arm64: paravirt: Use RCU read locks to guard stolen_time
b49bc8d615 KVM: x86/mmu: Update number of zapped pages even if page list is stable
146128ba26 PCI/PM: Avoid putting Elo i2 PCIe Ports in D3cold
ec0d801d1a Fix double fget() in vhost_net_set_backend()
b42e5e3a84 selinux: fix bad cleanup on error in hashtab_duplicate()
3ee8e109c3 perf: Fix sys_perf_event_open() race against self
18fb7d533c ALSA: hda/realtek: Add quirk for TongFang devices with pop noise
3eaf770163 ALSA: wavefront: Proper check of get_user() error
a34d018b6e ALSA: usb-audio: Restore Rane SL-1 quirk
f3f2247ac3 Reinstate some of "swiotlb: rework "fix info leak with DMA_FROM_DEVICE""
e2cfa7b093 Revert "swiotlb: fix info leak with DMA_FROM_DEVICE"
fe5ac3da50 nilfs2: fix lockdep warnings during disk space reclamation
d626fcdabe nilfs2: fix lockdep warnings in page operations for btree nodes
aca18bacdb ARM: 9191/1: arm/stacktrace, kasan: Silence KASAN warnings in unwind_frame()
0acaf9cacd platform/chrome: cros_ec_debugfs: detach log reader wq from devm
5a19f3c2d3 drbd: remove usage of list iterator variable after loop
9b7f321106 MIPS: lantiq: check the return value of kzalloc()
05c073b1ad fs: fix an infinite loop in iomap_fiemap
00d8b06a4e rtc: mc146818-lib: Fix the AltCentury for AMD platforms
87fd0dd43e nvme-multipath: fix hang when disk goes live over reconnect
3663d6023a tools/virtio: compile with -pthread
5a4cbcb3df vhost_vdpa: don't setup irq offloading when irq_num < 0
f0931ee125 s390/pci: improve zpci_dev reference counting
7d3f69cbde ALSA: hda/realtek: Enable headset mic on Lenovo P360
a59450656b crypto: x86/chacha20 - Avoid spurious jumps to other functions
39acee8aea crypto: stm32 - fix reference leak in stm32_crc_remove
703c80ff43 rtc: sun6i: Fix time overflow handling
bab037ebbe gfs2: Disable page faults during lockless buffered reads
e803f12ea2 nvme-pci: add quirks for Samsung X5 SSDs
5565fc538d Input: stmfts - fix reference leak in stmfts_input_open
d5e88c2d76 Input: add bounds checking to input_set_capability()
ea6a86886c um: Cleanup syscall_handler_t definition/cast, fix warning
c39b91fcd5 rtc: pcf2127: fix bug when reading alarm registers
2b4e5a2d7d rtc: fix use-after-free on device removal
67136fff5b igc: Update I226_K device ID
d0229838b6 igc: Remove phy->type checking
170110adbe igc: Remove _I_PHY_ID checking
55c820c1b2 Revert "drm/i915/opregion: check port number bounds for SWSCI display power state"
911b362678 floppy: use a statically allocated error counter
3c48558be5 io_uring: always grab file table for deferred statx
a1a2c957da usb: gadget: fix race when gadget driver register via ioctl

ABI updated to add a new symbol that is needed to be tracked:

Leaf changes summary: 1 artifact changed
Changed leaf types summary: 0 leaf type changed
Removed/Changed/Added functions summary: 0 Removed, 0 Changed, 1 Added function
Removed/Changed/Added variables summary: 0 Removed, 0 Changed, 0 Added variable

1 Added function:

  [A] 'function bool rng_is_initialized()'

Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>
Change-Id: Ib7f64defc72960f3603eb23b9a401a9fd42ec217
2022-09-28 09:54:28 +02:00

4505 lines
116 KiB
C

// SPDX-License-Identifier: GPL-2.0
/*
* fs/f2fs/super.c
*
* Copyright (c) 2012 Samsung Electronics Co., Ltd.
* http://www.samsung.com/
*/
#include <linux/module.h>
#include <linux/init.h>
#include <linux/fs.h>
#include <linux/statfs.h>
#include <linux/buffer_head.h>
#include <linux/backing-dev.h>
#include <linux/kthread.h>
#include <linux/parser.h>
#include <linux/mount.h>
#include <linux/seq_file.h>
#include <linux/proc_fs.h>
#include <linux/random.h>
#include <linux/exportfs.h>
#include <linux/blkdev.h>
#include <linux/quotaops.h>
#include <linux/f2fs_fs.h>
#include <linux/sysfs.h>
#include <linux/quota.h>
#include <linux/unicode.h>
#include <linux/part_stat.h>
#include <linux/zstd.h>
#include <linux/lz4.h>
#include "f2fs.h"
#include "node.h"
#include "segment.h"
#include "xattr.h"
#include "gc.h"
#define CREATE_TRACE_POINTS
#include <trace/events/f2fs.h>
static struct kmem_cache *f2fs_inode_cachep;
#ifdef CONFIG_F2FS_FAULT_INJECTION
const char *f2fs_fault_name[FAULT_MAX] = {
[FAULT_KMALLOC] = "kmalloc",
[FAULT_KVMALLOC] = "kvmalloc",
[FAULT_PAGE_ALLOC] = "page alloc",
[FAULT_PAGE_GET] = "page get",
[FAULT_ALLOC_NID] = "alloc nid",
[FAULT_ORPHAN] = "orphan",
[FAULT_BLOCK] = "no more block",
[FAULT_DIR_DEPTH] = "too big dir depth",
[FAULT_EVICT_INODE] = "evict_inode fail",
[FAULT_TRUNCATE] = "truncate fail",
[FAULT_READ_IO] = "read IO error",
[FAULT_CHECKPOINT] = "checkpoint error",
[FAULT_DISCARD] = "discard error",
[FAULT_WRITE_IO] = "write IO error",
};
void f2fs_build_fault_attr(struct f2fs_sb_info *sbi, unsigned int rate,
unsigned int type)
{
struct f2fs_fault_info *ffi = &F2FS_OPTION(sbi).fault_info;
if (rate) {
atomic_set(&ffi->inject_ops, 0);
ffi->inject_rate = rate;
}
if (type)
ffi->inject_type = type;
if (!rate && !type)
memset(ffi, 0, sizeof(struct f2fs_fault_info));
}
#endif
/* f2fs-wide shrinker description */
static struct shrinker f2fs_shrinker_info = {
.scan_objects = f2fs_shrink_scan,
.count_objects = f2fs_shrink_count,
.seeks = DEFAULT_SEEKS,
};
enum {
Opt_gc_background,
Opt_disable_roll_forward,
Opt_norecovery,
Opt_discard,
Opt_nodiscard,
Opt_noheap,
Opt_heap,
Opt_user_xattr,
Opt_nouser_xattr,
Opt_acl,
Opt_noacl,
Opt_active_logs,
Opt_disable_ext_identify,
Opt_inline_xattr,
Opt_noinline_xattr,
Opt_inline_xattr_size,
Opt_inline_data,
Opt_inline_dentry,
Opt_noinline_dentry,
Opt_flush_merge,
Opt_noflush_merge,
Opt_nobarrier,
Opt_fastboot,
Opt_extent_cache,
Opt_noextent_cache,
Opt_noinline_data,
Opt_data_flush,
Opt_reserve_root,
Opt_resgid,
Opt_resuid,
Opt_mode,
Opt_io_size_bits,
Opt_fault_injection,
Opt_fault_type,
Opt_lazytime,
Opt_nolazytime,
Opt_quota,
Opt_noquota,
Opt_usrquota,
Opt_grpquota,
Opt_prjquota,
Opt_usrjquota,
Opt_grpjquota,
Opt_prjjquota,
Opt_offusrjquota,
Opt_offgrpjquota,
Opt_offprjjquota,
Opt_jqfmt_vfsold,
Opt_jqfmt_vfsv0,
Opt_jqfmt_vfsv1,
Opt_whint,
Opt_alloc,
Opt_fsync,
Opt_test_dummy_encryption,
Opt_inlinecrypt,
Opt_checkpoint_disable,
Opt_checkpoint_disable_cap,
Opt_checkpoint_disable_cap_perc,
Opt_checkpoint_enable,
Opt_checkpoint_merge,
Opt_nocheckpoint_merge,
Opt_compress_algorithm,
Opt_compress_log_size,
Opt_compress_extension,
Opt_compress_chksum,
Opt_compress_mode,
Opt_compress_cache,
Opt_atgc,
Opt_gc_merge,
Opt_nogc_merge,
Opt_err,
};
static match_table_t f2fs_tokens = {
{Opt_gc_background, "background_gc=%s"},
{Opt_disable_roll_forward, "disable_roll_forward"},
{Opt_norecovery, "norecovery"},
{Opt_discard, "discard"},
{Opt_nodiscard, "nodiscard"},
{Opt_noheap, "no_heap"},
{Opt_heap, "heap"},
{Opt_user_xattr, "user_xattr"},
{Opt_nouser_xattr, "nouser_xattr"},
{Opt_acl, "acl"},
{Opt_noacl, "noacl"},
{Opt_active_logs, "active_logs=%u"},
{Opt_disable_ext_identify, "disable_ext_identify"},
{Opt_inline_xattr, "inline_xattr"},
{Opt_noinline_xattr, "noinline_xattr"},
{Opt_inline_xattr_size, "inline_xattr_size=%u"},
{Opt_inline_data, "inline_data"},
{Opt_inline_dentry, "inline_dentry"},
{Opt_noinline_dentry, "noinline_dentry"},
{Opt_flush_merge, "flush_merge"},
{Opt_noflush_merge, "noflush_merge"},
{Opt_nobarrier, "nobarrier"},
{Opt_fastboot, "fastboot"},
{Opt_extent_cache, "extent_cache"},
{Opt_noextent_cache, "noextent_cache"},
{Opt_noinline_data, "noinline_data"},
{Opt_data_flush, "data_flush"},
{Opt_reserve_root, "reserve_root=%u"},
{Opt_resgid, "resgid=%u"},
{Opt_resuid, "resuid=%u"},
{Opt_mode, "mode=%s"},
{Opt_io_size_bits, "io_bits=%u"},
{Opt_fault_injection, "fault_injection=%u"},
{Opt_fault_type, "fault_type=%u"},
{Opt_lazytime, "lazytime"},
{Opt_nolazytime, "nolazytime"},
{Opt_quota, "quota"},
{Opt_noquota, "noquota"},
{Opt_usrquota, "usrquota"},
{Opt_grpquota, "grpquota"},
{Opt_prjquota, "prjquota"},
{Opt_usrjquota, "usrjquota=%s"},
{Opt_grpjquota, "grpjquota=%s"},
{Opt_prjjquota, "prjjquota=%s"},
{Opt_offusrjquota, "usrjquota="},
{Opt_offgrpjquota, "grpjquota="},
{Opt_offprjjquota, "prjjquota="},
{Opt_jqfmt_vfsold, "jqfmt=vfsold"},
{Opt_jqfmt_vfsv0, "jqfmt=vfsv0"},
{Opt_jqfmt_vfsv1, "jqfmt=vfsv1"},
{Opt_whint, "whint_mode=%s"},
{Opt_alloc, "alloc_mode=%s"},
{Opt_fsync, "fsync_mode=%s"},
{Opt_test_dummy_encryption, "test_dummy_encryption=%s"},
{Opt_test_dummy_encryption, "test_dummy_encryption"},
{Opt_inlinecrypt, "inlinecrypt"},
{Opt_checkpoint_disable, "checkpoint=disable"},
{Opt_checkpoint_disable_cap, "checkpoint=disable:%u"},
{Opt_checkpoint_disable_cap_perc, "checkpoint=disable:%u%%"},
{Opt_checkpoint_enable, "checkpoint=enable"},
{Opt_checkpoint_merge, "checkpoint_merge"},
{Opt_nocheckpoint_merge, "nocheckpoint_merge"},
{Opt_compress_algorithm, "compress_algorithm=%s"},
{Opt_compress_log_size, "compress_log_size=%u"},
{Opt_compress_extension, "compress_extension=%s"},
{Opt_compress_chksum, "compress_chksum"},
{Opt_compress_mode, "compress_mode=%s"},
{Opt_compress_cache, "compress_cache"},
{Opt_atgc, "atgc"},
{Opt_gc_merge, "gc_merge"},
{Opt_nogc_merge, "nogc_merge"},
{Opt_err, NULL},
};
void f2fs_printk(struct f2fs_sb_info *sbi, const char *fmt, ...)
{
struct va_format vaf;
va_list args;
int level;
va_start(args, fmt);
level = printk_get_level(fmt);
vaf.fmt = printk_skip_level(fmt);
vaf.va = &args;
printk("%c%cF2FS-fs (%s): %pV\n",
KERN_SOH_ASCII, level, sbi->sb->s_id, &vaf);
va_end(args);
}
#ifdef CONFIG_UNICODE
static const struct f2fs_sb_encodings {
__u16 magic;
char *name;
char *version;
} f2fs_sb_encoding_map[] = {
{F2FS_ENC_UTF8_12_1, "utf8", "12.1.0"},
};
static int f2fs_sb_read_encoding(const struct f2fs_super_block *sb,
const struct f2fs_sb_encodings **encoding,
__u16 *flags)
{
__u16 magic = le16_to_cpu(sb->s_encoding);
int i;
for (i = 0; i < ARRAY_SIZE(f2fs_sb_encoding_map); i++)
if (magic == f2fs_sb_encoding_map[i].magic)
break;
if (i >= ARRAY_SIZE(f2fs_sb_encoding_map))
return -EINVAL;
*encoding = &f2fs_sb_encoding_map[i];
*flags = le16_to_cpu(sb->s_encoding_flags);
return 0;
}
struct kmem_cache *f2fs_cf_name_slab;
static int __init f2fs_create_casefold_cache(void)
{
f2fs_cf_name_slab = f2fs_kmem_cache_create("f2fs_casefolded_name",
F2FS_NAME_LEN);
if (!f2fs_cf_name_slab)
return -ENOMEM;
return 0;
}
static void f2fs_destroy_casefold_cache(void)
{
kmem_cache_destroy(f2fs_cf_name_slab);
}
#else
static int __init f2fs_create_casefold_cache(void) { return 0; }
static void f2fs_destroy_casefold_cache(void) { }
#endif
static inline void limit_reserve_root(struct f2fs_sb_info *sbi)
{
block_t limit = min((sbi->user_block_count >> 3),
sbi->user_block_count - sbi->reserved_blocks);
/* limit is 12.5% */
if (test_opt(sbi, RESERVE_ROOT) &&
F2FS_OPTION(sbi).root_reserved_blocks > limit) {
F2FS_OPTION(sbi).root_reserved_blocks = limit;
f2fs_info(sbi, "Reduce reserved blocks for root = %u",
F2FS_OPTION(sbi).root_reserved_blocks);
}
if (!test_opt(sbi, RESERVE_ROOT) &&
(!uid_eq(F2FS_OPTION(sbi).s_resuid,
make_kuid(&init_user_ns, F2FS_DEF_RESUID)) ||
!gid_eq(F2FS_OPTION(sbi).s_resgid,
make_kgid(&init_user_ns, F2FS_DEF_RESGID))))
f2fs_info(sbi, "Ignore s_resuid=%u, s_resgid=%u w/o reserve_root",
from_kuid_munged(&init_user_ns,
F2FS_OPTION(sbi).s_resuid),
from_kgid_munged(&init_user_ns,
F2FS_OPTION(sbi).s_resgid));
}
static inline int adjust_reserved_segment(struct f2fs_sb_info *sbi)
{
unsigned int sec_blks = sbi->blocks_per_seg * sbi->segs_per_sec;
unsigned int avg_vblocks;
unsigned int wanted_reserved_segments;
block_t avail_user_block_count;
if (!F2FS_IO_ALIGNED(sbi))
return 0;
/* average valid block count in section in worst case */
avg_vblocks = sec_blks / F2FS_IO_SIZE(sbi);
/*
* we need enough free space when migrating one section in worst case
*/
wanted_reserved_segments = (F2FS_IO_SIZE(sbi) / avg_vblocks) *
reserved_segments(sbi);
wanted_reserved_segments -= reserved_segments(sbi);
avail_user_block_count = sbi->user_block_count -
sbi->current_reserved_blocks -
F2FS_OPTION(sbi).root_reserved_blocks;
if (wanted_reserved_segments * sbi->blocks_per_seg >
avail_user_block_count) {
f2fs_err(sbi, "IO align feature can't grab additional reserved segment: %u, available segments: %u",
wanted_reserved_segments,
avail_user_block_count >> sbi->log_blocks_per_seg);
return -ENOSPC;
}
SM_I(sbi)->additional_reserved_segments = wanted_reserved_segments;
f2fs_info(sbi, "IO align feature needs additional reserved segment: %u",
wanted_reserved_segments);
return 0;
}
static inline void adjust_unusable_cap_perc(struct f2fs_sb_info *sbi)
{
if (!F2FS_OPTION(sbi).unusable_cap_perc)
return;
if (F2FS_OPTION(sbi).unusable_cap_perc == 100)
F2FS_OPTION(sbi).unusable_cap = sbi->user_block_count;
else
F2FS_OPTION(sbi).unusable_cap = (sbi->user_block_count / 100) *
F2FS_OPTION(sbi).unusable_cap_perc;
f2fs_info(sbi, "Adjust unusable cap for checkpoint=disable = %u / %u%%",
F2FS_OPTION(sbi).unusable_cap,
F2FS_OPTION(sbi).unusable_cap_perc);
}
static void init_once(void *foo)
{
struct f2fs_inode_info *fi = (struct f2fs_inode_info *) foo;
inode_init_once(&fi->vfs_inode);
}
#ifdef CONFIG_QUOTA
static const char * const quotatypes[] = INITQFNAMES;
#define QTYPE2NAME(t) (quotatypes[t])
static int f2fs_set_qf_name(struct super_block *sb, int qtype,
substring_t *args)
{
struct f2fs_sb_info *sbi = F2FS_SB(sb);
char *qname;
int ret = -EINVAL;
if (sb_any_quota_loaded(sb) && !F2FS_OPTION(sbi).s_qf_names[qtype]) {
f2fs_err(sbi, "Cannot change journaled quota options when quota turned on");
return -EINVAL;
}
if (f2fs_sb_has_quota_ino(sbi)) {
f2fs_info(sbi, "QUOTA feature is enabled, so ignore qf_name");
return 0;
}
qname = match_strdup(args);
if (!qname) {
f2fs_err(sbi, "Not enough memory for storing quotafile name");
return -ENOMEM;
}
if (F2FS_OPTION(sbi).s_qf_names[qtype]) {
if (strcmp(F2FS_OPTION(sbi).s_qf_names[qtype], qname) == 0)
ret = 0;
else
f2fs_err(sbi, "%s quota file already specified",
QTYPE2NAME(qtype));
goto errout;
}
if (strchr(qname, '/')) {
f2fs_err(sbi, "quotafile must be on filesystem root");
goto errout;
}
F2FS_OPTION(sbi).s_qf_names[qtype] = qname;
set_opt(sbi, QUOTA);
return 0;
errout:
kfree(qname);
return ret;
}
static int f2fs_clear_qf_name(struct super_block *sb, int qtype)
{
struct f2fs_sb_info *sbi = F2FS_SB(sb);
if (sb_any_quota_loaded(sb) && F2FS_OPTION(sbi).s_qf_names[qtype]) {
f2fs_err(sbi, "Cannot change journaled quota options when quota turned on");
return -EINVAL;
}
kfree(F2FS_OPTION(sbi).s_qf_names[qtype]);
F2FS_OPTION(sbi).s_qf_names[qtype] = NULL;
return 0;
}
static int f2fs_check_quota_options(struct f2fs_sb_info *sbi)
{
/*
* We do the test below only for project quotas. 'usrquota' and
* 'grpquota' mount options are allowed even without quota feature
* to support legacy quotas in quota files.
*/
if (test_opt(sbi, PRJQUOTA) && !f2fs_sb_has_project_quota(sbi)) {
f2fs_err(sbi, "Project quota feature not enabled. Cannot enable project quota enforcement.");
return -1;
}
if (F2FS_OPTION(sbi).s_qf_names[USRQUOTA] ||
F2FS_OPTION(sbi).s_qf_names[GRPQUOTA] ||
F2FS_OPTION(sbi).s_qf_names[PRJQUOTA]) {
if (test_opt(sbi, USRQUOTA) &&
F2FS_OPTION(sbi).s_qf_names[USRQUOTA])
clear_opt(sbi, USRQUOTA);
if (test_opt(sbi, GRPQUOTA) &&
F2FS_OPTION(sbi).s_qf_names[GRPQUOTA])
clear_opt(sbi, GRPQUOTA);
if (test_opt(sbi, PRJQUOTA) &&
F2FS_OPTION(sbi).s_qf_names[PRJQUOTA])
clear_opt(sbi, PRJQUOTA);
if (test_opt(sbi, GRPQUOTA) || test_opt(sbi, USRQUOTA) ||
test_opt(sbi, PRJQUOTA)) {
f2fs_err(sbi, "old and new quota format mixing");
return -1;
}
if (!F2FS_OPTION(sbi).s_jquota_fmt) {
f2fs_err(sbi, "journaled quota format not specified");
return -1;
}
}
if (f2fs_sb_has_quota_ino(sbi) && F2FS_OPTION(sbi).s_jquota_fmt) {
f2fs_info(sbi, "QUOTA feature is enabled, so ignore jquota_fmt");
F2FS_OPTION(sbi).s_jquota_fmt = 0;
}
return 0;
}
#endif
static int f2fs_set_test_dummy_encryption(struct super_block *sb,
const char *opt,
const substring_t *arg,
bool is_remount)
{
struct f2fs_sb_info *sbi = F2FS_SB(sb);
#ifdef CONFIG_FS_ENCRYPTION
int err;
if (!f2fs_sb_has_encrypt(sbi)) {
f2fs_err(sbi, "Encrypt feature is off");
return -EINVAL;
}
/*
* This mount option is just for testing, and it's not worthwhile to
* implement the extra complexity (e.g. RCU protection) that would be
* needed to allow it to be set or changed during remount. We do allow
* it to be specified during remount, but only if there is no change.
*/
if (is_remount && !F2FS_OPTION(sbi).dummy_enc_policy.policy) {
f2fs_warn(sbi, "Can't set test_dummy_encryption on remount");
return -EINVAL;
}
err = fscrypt_set_test_dummy_encryption(
sb, arg->from, &F2FS_OPTION(sbi).dummy_enc_policy);
if (err) {
if (err == -EEXIST)
f2fs_warn(sbi,
"Can't change test_dummy_encryption on remount");
else if (err == -EINVAL)
f2fs_warn(sbi, "Value of option \"%s\" is unrecognized",
opt);
else
f2fs_warn(sbi, "Error processing option \"%s\" [%d]",
opt, err);
return -EINVAL;
}
f2fs_warn(sbi, "Test dummy encryption mode enabled");
#else
f2fs_warn(sbi, "Test dummy encryption mount option ignored");
#endif
return 0;
}
#ifdef CONFIG_F2FS_FS_COMPRESSION
#ifdef CONFIG_F2FS_FS_LZ4
static int f2fs_set_lz4hc_level(struct f2fs_sb_info *sbi, const char *str)
{
#ifdef CONFIG_F2FS_FS_LZ4HC
unsigned int level;
#endif
if (strlen(str) == 3) {
F2FS_OPTION(sbi).compress_level = 0;
return 0;
}
#ifdef CONFIG_F2FS_FS_LZ4HC
str += 3;
if (str[0] != ':') {
f2fs_info(sbi, "wrong format, e.g. <alg_name>:<compr_level>");
return -EINVAL;
}
if (kstrtouint(str + 1, 10, &level))
return -EINVAL;
if (level < LZ4HC_MIN_CLEVEL || level > LZ4HC_MAX_CLEVEL) {
f2fs_info(sbi, "invalid lz4hc compress level: %d", level);
return -EINVAL;
}
F2FS_OPTION(sbi).compress_level = level;
return 0;
#else
f2fs_info(sbi, "kernel doesn't support lz4hc compression");
return -EINVAL;
#endif
}
#endif
#ifdef CONFIG_F2FS_FS_ZSTD
static int f2fs_set_zstd_level(struct f2fs_sb_info *sbi, const char *str)
{
unsigned int level;
int len = 4;
if (strlen(str) == len) {
F2FS_OPTION(sbi).compress_level = 0;
return 0;
}
str += len;
if (str[0] != ':') {
f2fs_info(sbi, "wrong format, e.g. <alg_name>:<compr_level>");
return -EINVAL;
}
if (kstrtouint(str + 1, 10, &level))
return -EINVAL;
if (!level || level > ZSTD_maxCLevel()) {
f2fs_info(sbi, "invalid zstd compress level: %d", level);
return -EINVAL;
}
F2FS_OPTION(sbi).compress_level = level;
return 0;
}
#endif
#endif
static int parse_options(struct super_block *sb, char *options, bool is_remount)
{
struct f2fs_sb_info *sbi = F2FS_SB(sb);
substring_t args[MAX_OPT_ARGS];
#ifdef CONFIG_F2FS_FS_COMPRESSION
unsigned char (*ext)[F2FS_EXTENSION_LEN];
int ext_cnt;
#endif
char *p, *name;
int arg = 0;
kuid_t uid;
kgid_t gid;
int ret;
if (!options)
goto default_check;
while ((p = strsep(&options, ",")) != NULL) {
int token;
if (!*p)
continue;
/*
* Initialize args struct so we know whether arg was
* found; some options take optional arguments.
*/
args[0].to = args[0].from = NULL;
token = match_token(p, f2fs_tokens, args);
switch (token) {
case Opt_gc_background:
name = match_strdup(&args[0]);
if (!name)
return -ENOMEM;
if (!strcmp(name, "on")) {
F2FS_OPTION(sbi).bggc_mode = BGGC_MODE_ON;
} else if (!strcmp(name, "off")) {
F2FS_OPTION(sbi).bggc_mode = BGGC_MODE_OFF;
} else if (!strcmp(name, "sync")) {
F2FS_OPTION(sbi).bggc_mode = BGGC_MODE_SYNC;
} else {
kfree(name);
return -EINVAL;
}
kfree(name);
break;
case Opt_disable_roll_forward:
set_opt(sbi, DISABLE_ROLL_FORWARD);
break;
case Opt_norecovery:
/* this option mounts f2fs with ro */
set_opt(sbi, NORECOVERY);
if (!f2fs_readonly(sb))
return -EINVAL;
break;
case Opt_discard:
set_opt(sbi, DISCARD);
break;
case Opt_nodiscard:
if (f2fs_sb_has_blkzoned(sbi)) {
f2fs_warn(sbi, "discard is required for zoned block devices");
return -EINVAL;
}
clear_opt(sbi, DISCARD);
break;
case Opt_noheap:
set_opt(sbi, NOHEAP);
break;
case Opt_heap:
clear_opt(sbi, NOHEAP);
break;
#ifdef CONFIG_F2FS_FS_XATTR
case Opt_user_xattr:
set_opt(sbi, XATTR_USER);
break;
case Opt_nouser_xattr:
clear_opt(sbi, XATTR_USER);
break;
case Opt_inline_xattr:
set_opt(sbi, INLINE_XATTR);
break;
case Opt_noinline_xattr:
clear_opt(sbi, INLINE_XATTR);
break;
case Opt_inline_xattr_size:
if (args->from && match_int(args, &arg))
return -EINVAL;
set_opt(sbi, INLINE_XATTR_SIZE);
F2FS_OPTION(sbi).inline_xattr_size = arg;
break;
#else
case Opt_user_xattr:
f2fs_info(sbi, "user_xattr options not supported");
break;
case Opt_nouser_xattr:
f2fs_info(sbi, "nouser_xattr options not supported");
break;
case Opt_inline_xattr:
f2fs_info(sbi, "inline_xattr options not supported");
break;
case Opt_noinline_xattr:
f2fs_info(sbi, "noinline_xattr options not supported");
break;
#endif
#ifdef CONFIG_F2FS_FS_POSIX_ACL
case Opt_acl:
set_opt(sbi, POSIX_ACL);
break;
case Opt_noacl:
clear_opt(sbi, POSIX_ACL);
break;
#else
case Opt_acl:
f2fs_info(sbi, "acl options not supported");
break;
case Opt_noacl:
f2fs_info(sbi, "noacl options not supported");
break;
#endif
case Opt_active_logs:
if (args->from && match_int(args, &arg))
return -EINVAL;
if (arg != 2 && arg != 4 &&
arg != NR_CURSEG_PERSIST_TYPE)
return -EINVAL;
F2FS_OPTION(sbi).active_logs = arg;
break;
case Opt_disable_ext_identify:
set_opt(sbi, DISABLE_EXT_IDENTIFY);
break;
case Opt_inline_data:
set_opt(sbi, INLINE_DATA);
break;
case Opt_inline_dentry:
set_opt(sbi, INLINE_DENTRY);
break;
case Opt_noinline_dentry:
clear_opt(sbi, INLINE_DENTRY);
break;
case Opt_flush_merge:
set_opt(sbi, FLUSH_MERGE);
break;
case Opt_noflush_merge:
clear_opt(sbi, FLUSH_MERGE);
break;
case Opt_nobarrier:
set_opt(sbi, NOBARRIER);
break;
case Opt_fastboot:
set_opt(sbi, FASTBOOT);
break;
case Opt_extent_cache:
set_opt(sbi, EXTENT_CACHE);
break;
case Opt_noextent_cache:
clear_opt(sbi, EXTENT_CACHE);
break;
case Opt_noinline_data:
clear_opt(sbi, INLINE_DATA);
break;
case Opt_data_flush:
set_opt(sbi, DATA_FLUSH);
break;
case Opt_reserve_root:
if (args->from && match_int(args, &arg))
return -EINVAL;
if (test_opt(sbi, RESERVE_ROOT)) {
f2fs_info(sbi, "Preserve previous reserve_root=%u",
F2FS_OPTION(sbi).root_reserved_blocks);
} else {
F2FS_OPTION(sbi).root_reserved_blocks = arg;
set_opt(sbi, RESERVE_ROOT);
}
break;
case Opt_resuid:
if (args->from && match_int(args, &arg))
return -EINVAL;
uid = make_kuid(current_user_ns(), arg);
if (!uid_valid(uid)) {
f2fs_err(sbi, "Invalid uid value %d", arg);
return -EINVAL;
}
F2FS_OPTION(sbi).s_resuid = uid;
break;
case Opt_resgid:
if (args->from && match_int(args, &arg))
return -EINVAL;
gid = make_kgid(current_user_ns(), arg);
if (!gid_valid(gid)) {
f2fs_err(sbi, "Invalid gid value %d", arg);
return -EINVAL;
}
F2FS_OPTION(sbi).s_resgid = gid;
break;
case Opt_mode:
name = match_strdup(&args[0]);
if (!name)
return -ENOMEM;
if (!strcmp(name, "adaptive")) {
if (f2fs_sb_has_blkzoned(sbi)) {
f2fs_warn(sbi, "adaptive mode is not allowed with zoned block device feature");
kfree(name);
return -EINVAL;
}
F2FS_OPTION(sbi).fs_mode = FS_MODE_ADAPTIVE;
} else if (!strcmp(name, "lfs")) {
F2FS_OPTION(sbi).fs_mode = FS_MODE_LFS;
} else {
kfree(name);
return -EINVAL;
}
kfree(name);
break;
case Opt_io_size_bits:
if (args->from && match_int(args, &arg))
return -EINVAL;
if (arg <= 0 || arg > __ilog2_u32(BIO_MAX_PAGES)) {
f2fs_warn(sbi, "Not support %d, larger than %d",
1 << arg, BIO_MAX_PAGES);
return -EINVAL;
}
F2FS_OPTION(sbi).write_io_size_bits = arg;
break;
#ifdef CONFIG_F2FS_FAULT_INJECTION
case Opt_fault_injection:
if (args->from && match_int(args, &arg))
return -EINVAL;
f2fs_build_fault_attr(sbi, arg, F2FS_ALL_FAULT_TYPE);
set_opt(sbi, FAULT_INJECTION);
break;
case Opt_fault_type:
if (args->from && match_int(args, &arg))
return -EINVAL;
f2fs_build_fault_attr(sbi, 0, arg);
set_opt(sbi, FAULT_INJECTION);
break;
#else
case Opt_fault_injection:
f2fs_info(sbi, "fault_injection options not supported");
break;
case Opt_fault_type:
f2fs_info(sbi, "fault_type options not supported");
break;
#endif
case Opt_lazytime:
sb->s_flags |= SB_LAZYTIME;
break;
case Opt_nolazytime:
sb->s_flags &= ~SB_LAZYTIME;
break;
#ifdef CONFIG_QUOTA
case Opt_quota:
case Opt_usrquota:
set_opt(sbi, USRQUOTA);
break;
case Opt_grpquota:
set_opt(sbi, GRPQUOTA);
break;
case Opt_prjquota:
set_opt(sbi, PRJQUOTA);
break;
case Opt_usrjquota:
ret = f2fs_set_qf_name(sb, USRQUOTA, &args[0]);
if (ret)
return ret;
break;
case Opt_grpjquota:
ret = f2fs_set_qf_name(sb, GRPQUOTA, &args[0]);
if (ret)
return ret;
break;
case Opt_prjjquota:
ret = f2fs_set_qf_name(sb, PRJQUOTA, &args[0]);
if (ret)
return ret;
break;
case Opt_offusrjquota:
ret = f2fs_clear_qf_name(sb, USRQUOTA);
if (ret)
return ret;
break;
case Opt_offgrpjquota:
ret = f2fs_clear_qf_name(sb, GRPQUOTA);
if (ret)
return ret;
break;
case Opt_offprjjquota:
ret = f2fs_clear_qf_name(sb, PRJQUOTA);
if (ret)
return ret;
break;
case Opt_jqfmt_vfsold:
F2FS_OPTION(sbi).s_jquota_fmt = QFMT_VFS_OLD;
break;
case Opt_jqfmt_vfsv0:
F2FS_OPTION(sbi).s_jquota_fmt = QFMT_VFS_V0;
break;
case Opt_jqfmt_vfsv1:
F2FS_OPTION(sbi).s_jquota_fmt = QFMT_VFS_V1;
break;
case Opt_noquota:
clear_opt(sbi, QUOTA);
clear_opt(sbi, USRQUOTA);
clear_opt(sbi, GRPQUOTA);
clear_opt(sbi, PRJQUOTA);
break;
#else
case Opt_quota:
case Opt_usrquota:
case Opt_grpquota:
case Opt_prjquota:
case Opt_usrjquota:
case Opt_grpjquota:
case Opt_prjjquota:
case Opt_offusrjquota:
case Opt_offgrpjquota:
case Opt_offprjjquota:
case Opt_jqfmt_vfsold:
case Opt_jqfmt_vfsv0:
case Opt_jqfmt_vfsv1:
case Opt_noquota:
f2fs_info(sbi, "quota operations not supported");
break;
#endif
case Opt_whint:
name = match_strdup(&args[0]);
if (!name)
return -ENOMEM;
if (!strcmp(name, "user-based")) {
F2FS_OPTION(sbi).whint_mode = WHINT_MODE_USER;
} else if (!strcmp(name, "off")) {
F2FS_OPTION(sbi).whint_mode = WHINT_MODE_OFF;
} else if (!strcmp(name, "fs-based")) {
F2FS_OPTION(sbi).whint_mode = WHINT_MODE_FS;
} else {
kfree(name);
return -EINVAL;
}
kfree(name);
break;
case Opt_alloc:
name = match_strdup(&args[0]);
if (!name)
return -ENOMEM;
if (!strcmp(name, "default")) {
F2FS_OPTION(sbi).alloc_mode = ALLOC_MODE_DEFAULT;
} else if (!strcmp(name, "reuse")) {
F2FS_OPTION(sbi).alloc_mode = ALLOC_MODE_REUSE;
} else {
kfree(name);
return -EINVAL;
}
kfree(name);
break;
case Opt_fsync:
name = match_strdup(&args[0]);
if (!name)
return -ENOMEM;
if (!strcmp(name, "posix")) {
F2FS_OPTION(sbi).fsync_mode = FSYNC_MODE_POSIX;
} else if (!strcmp(name, "strict")) {
F2FS_OPTION(sbi).fsync_mode = FSYNC_MODE_STRICT;
} else if (!strcmp(name, "nobarrier")) {
F2FS_OPTION(sbi).fsync_mode =
FSYNC_MODE_NOBARRIER;
} else {
kfree(name);
return -EINVAL;
}
kfree(name);
break;
case Opt_test_dummy_encryption:
ret = f2fs_set_test_dummy_encryption(sb, p, &args[0],
is_remount);
if (ret)
return ret;
break;
case Opt_inlinecrypt:
#ifdef CONFIG_FS_ENCRYPTION_INLINE_CRYPT
sb->s_flags |= SB_INLINECRYPT;
#else
f2fs_info(sbi, "inline encryption not supported");
#endif
break;
case Opt_checkpoint_disable_cap_perc:
if (args->from && match_int(args, &arg))
return -EINVAL;
if (arg < 0 || arg > 100)
return -EINVAL;
F2FS_OPTION(sbi).unusable_cap_perc = arg;
set_opt(sbi, DISABLE_CHECKPOINT);
break;
case Opt_checkpoint_disable_cap:
if (args->from && match_int(args, &arg))
return -EINVAL;
F2FS_OPTION(sbi).unusable_cap = arg;
set_opt(sbi, DISABLE_CHECKPOINT);
break;
case Opt_checkpoint_disable:
set_opt(sbi, DISABLE_CHECKPOINT);
break;
case Opt_checkpoint_enable:
clear_opt(sbi, DISABLE_CHECKPOINT);
break;
case Opt_checkpoint_merge:
set_opt(sbi, MERGE_CHECKPOINT);
break;
case Opt_nocheckpoint_merge:
clear_opt(sbi, MERGE_CHECKPOINT);
break;
#ifdef CONFIG_F2FS_FS_COMPRESSION
case Opt_compress_algorithm:
if (!f2fs_sb_has_compression(sbi)) {
f2fs_info(sbi, "Image doesn't support compression");
break;
}
name = match_strdup(&args[0]);
if (!name)
return -ENOMEM;
if (!strcmp(name, "lzo")) {
#ifdef CONFIG_F2FS_FS_LZO
F2FS_OPTION(sbi).compress_level = 0;
F2FS_OPTION(sbi).compress_algorithm =
COMPRESS_LZO;
#else
f2fs_info(sbi, "kernel doesn't support lzo compression");
#endif
} else if (!strncmp(name, "lz4", 3)) {
#ifdef CONFIG_F2FS_FS_LZ4
ret = f2fs_set_lz4hc_level(sbi, name);
if (ret) {
kfree(name);
return -EINVAL;
}
F2FS_OPTION(sbi).compress_algorithm =
COMPRESS_LZ4;
#else
f2fs_info(sbi, "kernel doesn't support lz4 compression");
#endif
} else if (!strncmp(name, "zstd", 4)) {
#ifdef CONFIG_F2FS_FS_ZSTD
ret = f2fs_set_zstd_level(sbi, name);
if (ret) {
kfree(name);
return -EINVAL;
}
F2FS_OPTION(sbi).compress_algorithm =
COMPRESS_ZSTD;
#else
f2fs_info(sbi, "kernel doesn't support zstd compression");
#endif
} else if (!strcmp(name, "lzo-rle")) {
#ifdef CONFIG_F2FS_FS_LZORLE
F2FS_OPTION(sbi).compress_level = 0;
F2FS_OPTION(sbi).compress_algorithm =
COMPRESS_LZORLE;
#else
f2fs_info(sbi, "kernel doesn't support lzorle compression");
#endif
} else {
kfree(name);
return -EINVAL;
}
kfree(name);
break;
case Opt_compress_log_size:
if (!f2fs_sb_has_compression(sbi)) {
f2fs_info(sbi, "Image doesn't support compression");
break;
}
if (args->from && match_int(args, &arg))
return -EINVAL;
if (arg < MIN_COMPRESS_LOG_SIZE ||
arg > MAX_COMPRESS_LOG_SIZE) {
f2fs_err(sbi,
"Compress cluster log size is out of range");
return -EINVAL;
}
F2FS_OPTION(sbi).compress_log_size = arg;
break;
case Opt_compress_extension:
if (!f2fs_sb_has_compression(sbi)) {
f2fs_info(sbi, "Image doesn't support compression");
break;
}
name = match_strdup(&args[0]);
if (!name)
return -ENOMEM;
ext = F2FS_OPTION(sbi).extensions;
ext_cnt = F2FS_OPTION(sbi).compress_ext_cnt;
if (strlen(name) >= F2FS_EXTENSION_LEN ||
ext_cnt >= COMPRESS_EXT_NUM) {
f2fs_err(sbi,
"invalid extension length/number");
kfree(name);
return -EINVAL;
}
strcpy(ext[ext_cnt], name);
F2FS_OPTION(sbi).compress_ext_cnt++;
kfree(name);
break;
case Opt_compress_chksum:
F2FS_OPTION(sbi).compress_chksum = true;
break;
case Opt_compress_mode:
name = match_strdup(&args[0]);
if (!name)
return -ENOMEM;
if (!strcmp(name, "fs")) {
F2FS_OPTION(sbi).compress_mode = COMPR_MODE_FS;
} else if (!strcmp(name, "user")) {
F2FS_OPTION(sbi).compress_mode = COMPR_MODE_USER;
} else {
kfree(name);
return -EINVAL;
}
kfree(name);
break;
case Opt_compress_cache:
set_opt(sbi, COMPRESS_CACHE);
break;
#else
case Opt_compress_algorithm:
case Opt_compress_log_size:
case Opt_compress_extension:
case Opt_compress_chksum:
case Opt_compress_mode:
case Opt_compress_cache:
f2fs_info(sbi, "compression options not supported");
break;
#endif
case Opt_atgc:
set_opt(sbi, ATGC);
break;
case Opt_gc_merge:
set_opt(sbi, GC_MERGE);
break;
case Opt_nogc_merge:
clear_opt(sbi, GC_MERGE);
break;
default:
f2fs_err(sbi, "Unrecognized mount option \"%s\" or missing value",
p);
return -EINVAL;
}
}
default_check:
#ifdef CONFIG_QUOTA
if (f2fs_check_quota_options(sbi))
return -EINVAL;
#else
if (f2fs_sb_has_quota_ino(sbi) && !f2fs_readonly(sbi->sb)) {
f2fs_info(sbi, "Filesystem with quota feature cannot be mounted RDWR without CONFIG_QUOTA");
return -EINVAL;
}
if (f2fs_sb_has_project_quota(sbi) && !f2fs_readonly(sbi->sb)) {
f2fs_err(sbi, "Filesystem with project quota feature cannot be mounted RDWR without CONFIG_QUOTA");
return -EINVAL;
}
#endif
#ifndef CONFIG_UNICODE
if (f2fs_sb_has_casefold(sbi)) {
f2fs_err(sbi,
"Filesystem with casefold feature cannot be mounted without CONFIG_UNICODE");
return -EINVAL;
}
#endif
/*
* The BLKZONED feature indicates that the drive was formatted with
* zone alignment optimization. This is optional for host-aware
* devices, but mandatory for host-managed zoned block devices.
*/
#ifndef CONFIG_BLK_DEV_ZONED
if (f2fs_sb_has_blkzoned(sbi)) {
f2fs_err(sbi, "Zoned block device support is not enabled");
return -EINVAL;
}
#endif
if (F2FS_IO_SIZE_BITS(sbi) && !f2fs_lfs_mode(sbi)) {
f2fs_err(sbi, "Should set mode=lfs with %uKB-sized IO",
F2FS_IO_SIZE_KB(sbi));
return -EINVAL;
}
if (test_opt(sbi, INLINE_XATTR_SIZE)) {
int min_size, max_size;
if (!f2fs_sb_has_extra_attr(sbi) ||
!f2fs_sb_has_flexible_inline_xattr(sbi)) {
f2fs_err(sbi, "extra_attr or flexible_inline_xattr feature is off");
return -EINVAL;
}
if (!test_opt(sbi, INLINE_XATTR)) {
f2fs_err(sbi, "inline_xattr_size option should be set with inline_xattr option");
return -EINVAL;
}
min_size = sizeof(struct f2fs_xattr_header) / sizeof(__le32);
max_size = MAX_INLINE_XATTR_SIZE;
if (F2FS_OPTION(sbi).inline_xattr_size < min_size ||
F2FS_OPTION(sbi).inline_xattr_size > max_size) {
f2fs_err(sbi, "inline xattr size is out of range: %d ~ %d",
min_size, max_size);
return -EINVAL;
}
}
if (test_opt(sbi, DISABLE_CHECKPOINT) && f2fs_lfs_mode(sbi)) {
f2fs_err(sbi, "LFS not compatible with checkpoint=disable");
return -EINVAL;
}
/* Not pass down write hints if the number of active logs is lesser
* than NR_CURSEG_PERSIST_TYPE.
*/
if (F2FS_OPTION(sbi).active_logs != NR_CURSEG_PERSIST_TYPE)
F2FS_OPTION(sbi).whint_mode = WHINT_MODE_OFF;
if (f2fs_sb_has_readonly(sbi) && !f2fs_readonly(sbi->sb)) {
f2fs_err(sbi, "Allow to mount readonly mode only");
return -EROFS;
}
return 0;
}
static struct inode *f2fs_alloc_inode(struct super_block *sb)
{
struct f2fs_inode_info *fi;
fi = kmem_cache_alloc(f2fs_inode_cachep, GFP_F2FS_ZERO);
if (!fi)
return NULL;
init_once((void *) fi);
/* Initialize f2fs-specific inode info */
atomic_set(&fi->dirty_pages, 0);
atomic_set(&fi->i_compr_blocks, 0);
init_f2fs_rwsem(&fi->i_sem);
spin_lock_init(&fi->i_size_lock);
INIT_LIST_HEAD(&fi->dirty_list);
INIT_LIST_HEAD(&fi->gdirty_list);
INIT_LIST_HEAD(&fi->inmem_ilist);
INIT_LIST_HEAD(&fi->inmem_pages);
mutex_init(&fi->inmem_lock);
init_f2fs_rwsem(&fi->i_gc_rwsem[READ]);
init_f2fs_rwsem(&fi->i_gc_rwsem[WRITE]);
init_f2fs_rwsem(&fi->i_mmap_sem);
init_f2fs_rwsem(&fi->i_xattr_sem);
/* Will be used by directory only */
fi->i_dir_level = F2FS_SB(sb)->dir_level;
return &fi->vfs_inode;
}
static int f2fs_drop_inode(struct inode *inode)
{
struct f2fs_sb_info *sbi = F2FS_I_SB(inode);
int ret;
/*
* during filesystem shutdown, if checkpoint is disabled,
* drop useless meta/node dirty pages.
*/
if (unlikely(is_sbi_flag_set(sbi, SBI_CP_DISABLED))) {
if (inode->i_ino == F2FS_NODE_INO(sbi) ||
inode->i_ino == F2FS_META_INO(sbi)) {
trace_f2fs_drop_inode(inode, 1);
return 1;
}
}
/*
* This is to avoid a deadlock condition like below.
* writeback_single_inode(inode)
* - f2fs_write_data_page
* - f2fs_gc -> iput -> evict
* - inode_wait_for_writeback(inode)
*/
if ((!inode_unhashed(inode) && inode->i_state & I_SYNC)) {
if (!inode->i_nlink && !is_bad_inode(inode)) {
/* to avoid evict_inode call simultaneously */
atomic_inc(&inode->i_count);
spin_unlock(&inode->i_lock);
/* some remained atomic pages should discarded */
if (f2fs_is_atomic_file(inode))
f2fs_drop_inmem_pages(inode);
/* should remain fi->extent_tree for writepage */
f2fs_destroy_extent_node(inode);
sb_start_intwrite(inode->i_sb);
f2fs_i_size_write(inode, 0);
f2fs_submit_merged_write_cond(F2FS_I_SB(inode),
inode, NULL, 0, DATA);
truncate_inode_pages_final(inode->i_mapping);
if (F2FS_HAS_BLOCKS(inode))
f2fs_truncate(inode);
sb_end_intwrite(inode->i_sb);
spin_lock(&inode->i_lock);
atomic_dec(&inode->i_count);
}
trace_f2fs_drop_inode(inode, 0);
return 0;
}
ret = generic_drop_inode(inode);
if (!ret)
ret = fscrypt_drop_inode(inode);
trace_f2fs_drop_inode(inode, ret);
return ret;
}
int f2fs_inode_dirtied(struct inode *inode, bool sync)
{
struct f2fs_sb_info *sbi = F2FS_I_SB(inode);
int ret = 0;
spin_lock(&sbi->inode_lock[DIRTY_META]);
if (is_inode_flag_set(inode, FI_DIRTY_INODE)) {
ret = 1;
} else {
set_inode_flag(inode, FI_DIRTY_INODE);
stat_inc_dirty_inode(sbi, DIRTY_META);
}
if (sync && list_empty(&F2FS_I(inode)->gdirty_list)) {
list_add_tail(&F2FS_I(inode)->gdirty_list,
&sbi->inode_list[DIRTY_META]);
inc_page_count(sbi, F2FS_DIRTY_IMETA);
}
spin_unlock(&sbi->inode_lock[DIRTY_META]);
return ret;
}
void f2fs_inode_synced(struct inode *inode)
{
struct f2fs_sb_info *sbi = F2FS_I_SB(inode);
spin_lock(&sbi->inode_lock[DIRTY_META]);
if (!is_inode_flag_set(inode, FI_DIRTY_INODE)) {
spin_unlock(&sbi->inode_lock[DIRTY_META]);
return;
}
if (!list_empty(&F2FS_I(inode)->gdirty_list)) {
list_del_init(&F2FS_I(inode)->gdirty_list);
dec_page_count(sbi, F2FS_DIRTY_IMETA);
}
clear_inode_flag(inode, FI_DIRTY_INODE);
clear_inode_flag(inode, FI_AUTO_RECOVER);
stat_dec_dirty_inode(F2FS_I_SB(inode), DIRTY_META);
spin_unlock(&sbi->inode_lock[DIRTY_META]);
}
/*
* f2fs_dirty_inode() is called from __mark_inode_dirty()
*
* We should call set_dirty_inode to write the dirty inode through write_inode.
*/
static void f2fs_dirty_inode(struct inode *inode, int flags)
{
struct f2fs_sb_info *sbi = F2FS_I_SB(inode);
if (inode->i_ino == F2FS_NODE_INO(sbi) ||
inode->i_ino == F2FS_META_INO(sbi))
return;
if (flags == I_DIRTY_TIME)
return;
if (is_inode_flag_set(inode, FI_AUTO_RECOVER))
clear_inode_flag(inode, FI_AUTO_RECOVER);
f2fs_inode_dirtied(inode, false);
}
static void f2fs_free_inode(struct inode *inode)
{
fscrypt_free_inode(inode);
kmem_cache_free(f2fs_inode_cachep, F2FS_I(inode));
}
static void destroy_percpu_info(struct f2fs_sb_info *sbi)
{
percpu_counter_destroy(&sbi->alloc_valid_block_count);
percpu_counter_destroy(&sbi->total_valid_inode_count);
}
static void destroy_device_list(struct f2fs_sb_info *sbi)
{
int i;
for (i = 0; i < sbi->s_ndevs; i++) {
blkdev_put(FDEV(i).bdev, FMODE_EXCL);
#ifdef CONFIG_BLK_DEV_ZONED
kvfree(FDEV(i).blkz_seq);
kfree(FDEV(i).zone_capacity_blocks);
#endif
}
kvfree(sbi->devs);
}
static void f2fs_put_super(struct super_block *sb)
{
struct f2fs_sb_info *sbi = F2FS_SB(sb);
int i;
bool dropped;
/* unregister procfs/sysfs entries in advance to avoid race case */
f2fs_unregister_sysfs(sbi);
f2fs_quota_off_umount(sb);
/* prevent remaining shrinker jobs */
mutex_lock(&sbi->umount_mutex);
/*
* flush all issued checkpoints and stop checkpoint issue thread.
* after then, all checkpoints should be done by each process context.
*/
f2fs_stop_ckpt_thread(sbi);
/*
* We don't need to do checkpoint when superblock is clean.
* But, the previous checkpoint was not done by umount, it needs to do
* clean checkpoint again.
*/
if ((is_sbi_flag_set(sbi, SBI_IS_DIRTY) ||
!is_set_ckpt_flags(sbi, CP_UMOUNT_FLAG))) {
struct cp_control cpc = {
.reason = CP_UMOUNT,
};
f2fs_write_checkpoint(sbi, &cpc);
}
/* be sure to wait for any on-going discard commands */
dropped = f2fs_issue_discard_timeout(sbi);
if ((f2fs_hw_support_discard(sbi) || f2fs_hw_should_discard(sbi)) &&
!sbi->discard_blks && !dropped) {
struct cp_control cpc = {
.reason = CP_UMOUNT | CP_TRIMMED,
};
f2fs_write_checkpoint(sbi, &cpc);
}
/*
* normally superblock is clean, so we need to release this.
* In addition, EIO will skip do checkpoint, we need this as well.
*/
f2fs_release_ino_entry(sbi, true);
f2fs_leave_shrinker(sbi);
mutex_unlock(&sbi->umount_mutex);
/* our cp_error case, we can wait for any writeback page */
f2fs_flush_merged_writes(sbi);
f2fs_wait_on_all_pages(sbi, F2FS_WB_CP_DATA);
f2fs_bug_on(sbi, sbi->fsync_node_num);
f2fs_destroy_compress_inode(sbi);
iput(sbi->node_inode);
sbi->node_inode = NULL;
iput(sbi->meta_inode);
sbi->meta_inode = NULL;
/*
* iput() can update stat information, if f2fs_write_checkpoint()
* above failed with error.
*/
f2fs_destroy_stats(sbi);
/* destroy f2fs internal modules */
f2fs_destroy_node_manager(sbi);
f2fs_destroy_segment_manager(sbi);
f2fs_destroy_post_read_wq(sbi);
kvfree(sbi->ckpt);
sb->s_fs_info = NULL;
if (sbi->s_chksum_driver)
crypto_free_shash(sbi->s_chksum_driver);
kfree(sbi->raw_super);
destroy_device_list(sbi);
f2fs_destroy_page_array_cache(sbi);
f2fs_destroy_xattr_caches(sbi);
mempool_destroy(sbi->write_io_dummy);
#ifdef CONFIG_QUOTA
for (i = 0; i < MAXQUOTAS; i++)
kfree(F2FS_OPTION(sbi).s_qf_names[i]);
#endif
fscrypt_free_dummy_policy(&F2FS_OPTION(sbi).dummy_enc_policy);
destroy_percpu_info(sbi);
for (i = 0; i < NR_PAGE_TYPE; i++)
kvfree(sbi->write_io[i]);
#ifdef CONFIG_UNICODE
utf8_unload(sb->s_encoding);
#endif
kfree(sbi);
}
int f2fs_sync_fs(struct super_block *sb, int sync)
{
struct f2fs_sb_info *sbi = F2FS_SB(sb);
int err = 0;
if (unlikely(f2fs_cp_error(sbi)))
return 0;
if (unlikely(is_sbi_flag_set(sbi, SBI_CP_DISABLED)))
return 0;
trace_f2fs_sync_fs(sb, sync);
if (unlikely(is_sbi_flag_set(sbi, SBI_POR_DOING)))
return -EAGAIN;
if (sync)
err = f2fs_issue_checkpoint(sbi);
return err;
}
static int f2fs_freeze(struct super_block *sb)
{
if (f2fs_readonly(sb))
return 0;
/* IO error happened before */
if (unlikely(f2fs_cp_error(F2FS_SB(sb))))
return -EIO;
/* must be clean, since sync_filesystem() was already called */
if (is_sbi_flag_set(F2FS_SB(sb), SBI_IS_DIRTY))
return -EINVAL;
/* Let's flush checkpoints and stop the thread. */
f2fs_flush_ckpt_thread(F2FS_SB(sb));
/* to avoid deadlock on f2fs_evict_inode->SB_FREEZE_FS */
set_sbi_flag(F2FS_SB(sb), SBI_IS_FREEZING);
return 0;
}
static int f2fs_unfreeze(struct super_block *sb)
{
clear_sbi_flag(F2FS_SB(sb), SBI_IS_FREEZING);
return 0;
}
#ifdef CONFIG_QUOTA
static int f2fs_statfs_project(struct super_block *sb,
kprojid_t projid, struct kstatfs *buf)
{
struct kqid qid;
struct dquot *dquot;
u64 limit;
u64 curblock;
qid = make_kqid_projid(projid);
dquot = dqget(sb, qid);
if (IS_ERR(dquot))
return PTR_ERR(dquot);
spin_lock(&dquot->dq_dqb_lock);
limit = min_not_zero(dquot->dq_dqb.dqb_bsoftlimit,
dquot->dq_dqb.dqb_bhardlimit);
if (limit)
limit >>= sb->s_blocksize_bits;
if (limit && buf->f_blocks > limit) {
curblock = (dquot->dq_dqb.dqb_curspace +
dquot->dq_dqb.dqb_rsvspace) >> sb->s_blocksize_bits;
buf->f_blocks = limit;
buf->f_bfree = buf->f_bavail =
(buf->f_blocks > curblock) ?
(buf->f_blocks - curblock) : 0;
}
limit = min_not_zero(dquot->dq_dqb.dqb_isoftlimit,
dquot->dq_dqb.dqb_ihardlimit);
if (limit && buf->f_files > limit) {
buf->f_files = limit;
buf->f_ffree =
(buf->f_files > dquot->dq_dqb.dqb_curinodes) ?
(buf->f_files - dquot->dq_dqb.dqb_curinodes) : 0;
}
spin_unlock(&dquot->dq_dqb_lock);
dqput(dquot);
return 0;
}
#endif
static int f2fs_statfs(struct dentry *dentry, struct kstatfs *buf)
{
struct super_block *sb = dentry->d_sb;
struct f2fs_sb_info *sbi = F2FS_SB(sb);
u64 id = huge_encode_dev(sb->s_bdev->bd_dev);
block_t total_count, user_block_count, start_count;
u64 avail_node_count;
total_count = le64_to_cpu(sbi->raw_super->block_count);
user_block_count = sbi->user_block_count;
start_count = le32_to_cpu(sbi->raw_super->segment0_blkaddr);
buf->f_type = F2FS_SUPER_MAGIC;
buf->f_bsize = sbi->blocksize;
buf->f_blocks = total_count - start_count;
buf->f_bfree = user_block_count - valid_user_blocks(sbi) -
sbi->current_reserved_blocks;
spin_lock(&sbi->stat_lock);
if (unlikely(buf->f_bfree <= sbi->unusable_block_count))
buf->f_bfree = 0;
else
buf->f_bfree -= sbi->unusable_block_count;
spin_unlock(&sbi->stat_lock);
if (buf->f_bfree > F2FS_OPTION(sbi).root_reserved_blocks)
buf->f_bavail = buf->f_bfree -
F2FS_OPTION(sbi).root_reserved_blocks;
else
buf->f_bavail = 0;
avail_node_count = sbi->total_node_count - F2FS_RESERVED_NODE_NUM;
if (avail_node_count > user_block_count) {
buf->f_files = user_block_count;
buf->f_ffree = buf->f_bavail;
} else {
buf->f_files = avail_node_count;
buf->f_ffree = min(avail_node_count - valid_node_count(sbi),
buf->f_bavail);
}
buf->f_namelen = F2FS_NAME_LEN;
buf->f_fsid = u64_to_fsid(id);
#ifdef CONFIG_QUOTA
if (is_inode_flag_set(dentry->d_inode, FI_PROJ_INHERIT) &&
sb_has_quota_limits_enabled(sb, PRJQUOTA)) {
f2fs_statfs_project(sb, F2FS_I(dentry->d_inode)->i_projid, buf);
}
#endif
return 0;
}
static inline void f2fs_show_quota_options(struct seq_file *seq,
struct super_block *sb)
{
#ifdef CONFIG_QUOTA
struct f2fs_sb_info *sbi = F2FS_SB(sb);
if (F2FS_OPTION(sbi).s_jquota_fmt) {
char *fmtname = "";
switch (F2FS_OPTION(sbi).s_jquota_fmt) {
case QFMT_VFS_OLD:
fmtname = "vfsold";
break;
case QFMT_VFS_V0:
fmtname = "vfsv0";
break;
case QFMT_VFS_V1:
fmtname = "vfsv1";
break;
}
seq_printf(seq, ",jqfmt=%s", fmtname);
}
if (F2FS_OPTION(sbi).s_qf_names[USRQUOTA])
seq_show_option(seq, "usrjquota",
F2FS_OPTION(sbi).s_qf_names[USRQUOTA]);
if (F2FS_OPTION(sbi).s_qf_names[GRPQUOTA])
seq_show_option(seq, "grpjquota",
F2FS_OPTION(sbi).s_qf_names[GRPQUOTA]);
if (F2FS_OPTION(sbi).s_qf_names[PRJQUOTA])
seq_show_option(seq, "prjjquota",
F2FS_OPTION(sbi).s_qf_names[PRJQUOTA]);
#endif
}
#ifdef CONFIG_F2FS_FS_COMPRESSION
static inline void f2fs_show_compress_options(struct seq_file *seq,
struct super_block *sb)
{
struct f2fs_sb_info *sbi = F2FS_SB(sb);
char *algtype = "";
int i;
if (!f2fs_sb_has_compression(sbi))
return;
switch (F2FS_OPTION(sbi).compress_algorithm) {
case COMPRESS_LZO:
algtype = "lzo";
break;
case COMPRESS_LZ4:
algtype = "lz4";
break;
case COMPRESS_ZSTD:
algtype = "zstd";
break;
case COMPRESS_LZORLE:
algtype = "lzo-rle";
break;
}
seq_printf(seq, ",compress_algorithm=%s", algtype);
if (F2FS_OPTION(sbi).compress_level)
seq_printf(seq, ":%d", F2FS_OPTION(sbi).compress_level);
seq_printf(seq, ",compress_log_size=%u",
F2FS_OPTION(sbi).compress_log_size);
for (i = 0; i < F2FS_OPTION(sbi).compress_ext_cnt; i++) {
seq_printf(seq, ",compress_extension=%s",
F2FS_OPTION(sbi).extensions[i]);
}
if (F2FS_OPTION(sbi).compress_chksum)
seq_puts(seq, ",compress_chksum");
if (F2FS_OPTION(sbi).compress_mode == COMPR_MODE_FS)
seq_printf(seq, ",compress_mode=%s", "fs");
else if (F2FS_OPTION(sbi).compress_mode == COMPR_MODE_USER)
seq_printf(seq, ",compress_mode=%s", "user");
if (test_opt(sbi, COMPRESS_CACHE))
seq_puts(seq, ",compress_cache");
}
#endif
static int f2fs_show_options(struct seq_file *seq, struct dentry *root)
{
struct f2fs_sb_info *sbi = F2FS_SB(root->d_sb);
if (F2FS_OPTION(sbi).bggc_mode == BGGC_MODE_SYNC)
seq_printf(seq, ",background_gc=%s", "sync");
else if (F2FS_OPTION(sbi).bggc_mode == BGGC_MODE_ON)
seq_printf(seq, ",background_gc=%s", "on");
else if (F2FS_OPTION(sbi).bggc_mode == BGGC_MODE_OFF)
seq_printf(seq, ",background_gc=%s", "off");
if (test_opt(sbi, GC_MERGE))
seq_puts(seq, ",gc_merge");
if (test_opt(sbi, DISABLE_ROLL_FORWARD))
seq_puts(seq, ",disable_roll_forward");
if (test_opt(sbi, NORECOVERY))
seq_puts(seq, ",norecovery");
if (test_opt(sbi, DISCARD))
seq_puts(seq, ",discard");
else
seq_puts(seq, ",nodiscard");
if (test_opt(sbi, NOHEAP))
seq_puts(seq, ",no_heap");
else
seq_puts(seq, ",heap");
#ifdef CONFIG_F2FS_FS_XATTR
if (test_opt(sbi, XATTR_USER))
seq_puts(seq, ",user_xattr");
else
seq_puts(seq, ",nouser_xattr");
if (test_opt(sbi, INLINE_XATTR))
seq_puts(seq, ",inline_xattr");
else
seq_puts(seq, ",noinline_xattr");
if (test_opt(sbi, INLINE_XATTR_SIZE))
seq_printf(seq, ",inline_xattr_size=%u",
F2FS_OPTION(sbi).inline_xattr_size);
#endif
#ifdef CONFIG_F2FS_FS_POSIX_ACL
if (test_opt(sbi, POSIX_ACL))
seq_puts(seq, ",acl");
else
seq_puts(seq, ",noacl");
#endif
if (test_opt(sbi, DISABLE_EXT_IDENTIFY))
seq_puts(seq, ",disable_ext_identify");
if (test_opt(sbi, INLINE_DATA))
seq_puts(seq, ",inline_data");
else
seq_puts(seq, ",noinline_data");
if (test_opt(sbi, INLINE_DENTRY))
seq_puts(seq, ",inline_dentry");
else
seq_puts(seq, ",noinline_dentry");
if (!f2fs_readonly(sbi->sb) && test_opt(sbi, FLUSH_MERGE))
seq_puts(seq, ",flush_merge");
if (test_opt(sbi, NOBARRIER))
seq_puts(seq, ",nobarrier");
if (test_opt(sbi, FASTBOOT))
seq_puts(seq, ",fastboot");
if (test_opt(sbi, EXTENT_CACHE))
seq_puts(seq, ",extent_cache");
else
seq_puts(seq, ",noextent_cache");
if (test_opt(sbi, DATA_FLUSH))
seq_puts(seq, ",data_flush");
seq_puts(seq, ",mode=");
if (F2FS_OPTION(sbi).fs_mode == FS_MODE_ADAPTIVE)
seq_puts(seq, "adaptive");
else if (F2FS_OPTION(sbi).fs_mode == FS_MODE_LFS)
seq_puts(seq, "lfs");
seq_printf(seq, ",active_logs=%u", F2FS_OPTION(sbi).active_logs);
if (test_opt(sbi, RESERVE_ROOT))
seq_printf(seq, ",reserve_root=%u,resuid=%u,resgid=%u",
F2FS_OPTION(sbi).root_reserved_blocks,
from_kuid_munged(&init_user_ns,
F2FS_OPTION(sbi).s_resuid),
from_kgid_munged(&init_user_ns,
F2FS_OPTION(sbi).s_resgid));
if (F2FS_IO_SIZE_BITS(sbi))
seq_printf(seq, ",io_bits=%u",
F2FS_OPTION(sbi).write_io_size_bits);
#ifdef CONFIG_F2FS_FAULT_INJECTION
if (test_opt(sbi, FAULT_INJECTION)) {
seq_printf(seq, ",fault_injection=%u",
F2FS_OPTION(sbi).fault_info.inject_rate);
seq_printf(seq, ",fault_type=%u",
F2FS_OPTION(sbi).fault_info.inject_type);
}
#endif
#ifdef CONFIG_QUOTA
if (test_opt(sbi, QUOTA))
seq_puts(seq, ",quota");
if (test_opt(sbi, USRQUOTA))
seq_puts(seq, ",usrquota");
if (test_opt(sbi, GRPQUOTA))
seq_puts(seq, ",grpquota");
if (test_opt(sbi, PRJQUOTA))
seq_puts(seq, ",prjquota");
#endif
f2fs_show_quota_options(seq, sbi->sb);
if (F2FS_OPTION(sbi).whint_mode == WHINT_MODE_USER)
seq_printf(seq, ",whint_mode=%s", "user-based");
else if (F2FS_OPTION(sbi).whint_mode == WHINT_MODE_FS)
seq_printf(seq, ",whint_mode=%s", "fs-based");
fscrypt_show_test_dummy_encryption(seq, ',', sbi->sb);
if (sbi->sb->s_flags & SB_INLINECRYPT)
seq_puts(seq, ",inlinecrypt");
if (F2FS_OPTION(sbi).alloc_mode == ALLOC_MODE_DEFAULT)
seq_printf(seq, ",alloc_mode=%s", "default");
else if (F2FS_OPTION(sbi).alloc_mode == ALLOC_MODE_REUSE)
seq_printf(seq, ",alloc_mode=%s", "reuse");
if (test_opt(sbi, DISABLE_CHECKPOINT))
seq_printf(seq, ",checkpoint=disable:%u",
F2FS_OPTION(sbi).unusable_cap);
if (test_opt(sbi, MERGE_CHECKPOINT))
seq_puts(seq, ",checkpoint_merge");
else
seq_puts(seq, ",nocheckpoint_merge");
if (F2FS_OPTION(sbi).fsync_mode == FSYNC_MODE_POSIX)
seq_printf(seq, ",fsync_mode=%s", "posix");
else if (F2FS_OPTION(sbi).fsync_mode == FSYNC_MODE_STRICT)
seq_printf(seq, ",fsync_mode=%s", "strict");
else if (F2FS_OPTION(sbi).fsync_mode == FSYNC_MODE_NOBARRIER)
seq_printf(seq, ",fsync_mode=%s", "nobarrier");
#ifdef CONFIG_F2FS_FS_COMPRESSION
f2fs_show_compress_options(seq, sbi->sb);
#endif
if (test_opt(sbi, ATGC))
seq_puts(seq, ",atgc");
return 0;
}
static void default_options(struct f2fs_sb_info *sbi)
{
/* init some FS parameters */
if (f2fs_sb_has_readonly(sbi))
F2FS_OPTION(sbi).active_logs = NR_CURSEG_RO_TYPE;
else
F2FS_OPTION(sbi).active_logs = NR_CURSEG_PERSIST_TYPE;
F2FS_OPTION(sbi).inline_xattr_size = DEFAULT_INLINE_XATTR_ADDRS;
F2FS_OPTION(sbi).whint_mode = WHINT_MODE_OFF;
F2FS_OPTION(sbi).alloc_mode = ALLOC_MODE_DEFAULT;
F2FS_OPTION(sbi).fsync_mode = FSYNC_MODE_POSIX;
F2FS_OPTION(sbi).s_resuid = make_kuid(&init_user_ns, F2FS_DEF_RESUID);
F2FS_OPTION(sbi).s_resgid = make_kgid(&init_user_ns, F2FS_DEF_RESGID);
F2FS_OPTION(sbi).compress_algorithm = COMPRESS_LZ4;
F2FS_OPTION(sbi).compress_log_size = MIN_COMPRESS_LOG_SIZE;
F2FS_OPTION(sbi).compress_ext_cnt = 0;
F2FS_OPTION(sbi).compress_mode = COMPR_MODE_FS;
F2FS_OPTION(sbi).bggc_mode = BGGC_MODE_ON;
sbi->sb->s_flags &= ~SB_INLINECRYPT;
set_opt(sbi, INLINE_XATTR);
set_opt(sbi, INLINE_DATA);
set_opt(sbi, INLINE_DENTRY);
set_opt(sbi, EXTENT_CACHE);
set_opt(sbi, NOHEAP);
clear_opt(sbi, DISABLE_CHECKPOINT);
set_opt(sbi, MERGE_CHECKPOINT);
F2FS_OPTION(sbi).unusable_cap = 0;
sbi->sb->s_flags |= SB_LAZYTIME;
set_opt(sbi, FLUSH_MERGE);
set_opt(sbi, DISCARD);
if (f2fs_sb_has_blkzoned(sbi))
F2FS_OPTION(sbi).fs_mode = FS_MODE_LFS;
else
F2FS_OPTION(sbi).fs_mode = FS_MODE_ADAPTIVE;
#ifdef CONFIG_F2FS_FS_XATTR
set_opt(sbi, XATTR_USER);
#endif
#ifdef CONFIG_F2FS_FS_POSIX_ACL
set_opt(sbi, POSIX_ACL);
#endif
f2fs_build_fault_attr(sbi, 0, 0);
}
#ifdef CONFIG_QUOTA
static int f2fs_enable_quotas(struct super_block *sb);
#endif
static int f2fs_disable_checkpoint(struct f2fs_sb_info *sbi)
{
unsigned int s_flags = sbi->sb->s_flags;
struct cp_control cpc;
int err = 0;
int ret;
block_t unusable;
if (s_flags & SB_RDONLY) {
f2fs_err(sbi, "checkpoint=disable on readonly fs");
return -EINVAL;
}
sbi->sb->s_flags |= SB_ACTIVE;
f2fs_update_time(sbi, DISABLE_TIME);
while (!f2fs_time_over(sbi, DISABLE_TIME)) {
f2fs_down_write(&sbi->gc_lock);
err = f2fs_gc(sbi, true, false, false, NULL_SEGNO);
if (err == -ENODATA) {
err = 0;
break;
}
if (err && err != -EAGAIN)
break;
}
ret = sync_filesystem(sbi->sb);
if (ret || err) {
err = ret ? ret : err;
goto restore_flag;
}
unusable = f2fs_get_unusable_blocks(sbi);
if (f2fs_disable_cp_again(sbi, unusable)) {
err = -EAGAIN;
goto restore_flag;
}
f2fs_down_write(&sbi->gc_lock);
cpc.reason = CP_PAUSE;
set_sbi_flag(sbi, SBI_CP_DISABLED);
err = f2fs_write_checkpoint(sbi, &cpc);
if (err)
goto out_unlock;
spin_lock(&sbi->stat_lock);
sbi->unusable_block_count = unusable;
spin_unlock(&sbi->stat_lock);
out_unlock:
f2fs_up_write(&sbi->gc_lock);
restore_flag:
sbi->sb->s_flags = s_flags; /* Restore SB_RDONLY status */
return err;
}
static void f2fs_enable_checkpoint(struct f2fs_sb_info *sbi)
{
int retry = DEFAULT_RETRY_IO_COUNT;
/* we should flush all the data to keep data consistency */
do {
sync_inodes_sb(sbi->sb);
cond_resched();
congestion_wait(BLK_RW_ASYNC, DEFAULT_IO_TIMEOUT);
} while (get_pages(sbi, F2FS_DIRTY_DATA) && retry--);
if (unlikely(retry < 0))
f2fs_warn(sbi, "checkpoint=enable has some unwritten data.");
f2fs_down_write(&sbi->gc_lock);
f2fs_dirty_to_prefree(sbi);
clear_sbi_flag(sbi, SBI_CP_DISABLED);
set_sbi_flag(sbi, SBI_IS_DIRTY);
f2fs_up_write(&sbi->gc_lock);
f2fs_sync_fs(sbi->sb, 1);
/* Let's ensure there's no pending checkpoint anymore */
f2fs_flush_ckpt_thread(sbi);
}
static int f2fs_remount(struct super_block *sb, int *flags, char *data)
{
struct f2fs_sb_info *sbi = F2FS_SB(sb);
struct f2fs_mount_info org_mount_opt;
unsigned long old_sb_flags;
int err;
bool need_restart_gc = false, need_stop_gc = false;
bool need_restart_ckpt = false, need_stop_ckpt = false;
bool need_restart_flush = false, need_stop_flush = false;
bool no_extent_cache = !test_opt(sbi, EXTENT_CACHE);
bool disable_checkpoint = test_opt(sbi, DISABLE_CHECKPOINT);
bool no_io_align = !F2FS_IO_ALIGNED(sbi);
bool no_atgc = !test_opt(sbi, ATGC);
bool no_compress_cache = !test_opt(sbi, COMPRESS_CACHE);
bool checkpoint_changed;
#ifdef CONFIG_QUOTA
int i, j;
#endif
/*
* Save the old mount options in case we
* need to restore them.
*/
org_mount_opt = sbi->mount_opt;
old_sb_flags = sb->s_flags;
#ifdef CONFIG_QUOTA
org_mount_opt.s_jquota_fmt = F2FS_OPTION(sbi).s_jquota_fmt;
for (i = 0; i < MAXQUOTAS; i++) {
if (F2FS_OPTION(sbi).s_qf_names[i]) {
org_mount_opt.s_qf_names[i] =
kstrdup(F2FS_OPTION(sbi).s_qf_names[i],
GFP_KERNEL);
if (!org_mount_opt.s_qf_names[i]) {
for (j = 0; j < i; j++)
kfree(org_mount_opt.s_qf_names[j]);
return -ENOMEM;
}
} else {
org_mount_opt.s_qf_names[i] = NULL;
}
}
#endif
/* recover superblocks we couldn't write due to previous RO mount */
if (!(*flags & SB_RDONLY) && is_sbi_flag_set(sbi, SBI_NEED_SB_WRITE)) {
err = f2fs_commit_super(sbi, false);
f2fs_info(sbi, "Try to recover all the superblocks, ret: %d",
err);
if (!err)
clear_sbi_flag(sbi, SBI_NEED_SB_WRITE);
}
default_options(sbi);
/* parse mount options */
err = parse_options(sb, data, true);
if (err)
goto restore_opts;
checkpoint_changed =
disable_checkpoint != test_opt(sbi, DISABLE_CHECKPOINT);
/*
* Previous and new state of filesystem is RO,
* so skip checking GC and FLUSH_MERGE conditions.
*/
if (f2fs_readonly(sb) && (*flags & SB_RDONLY))
goto skip;
if (f2fs_sb_has_readonly(sbi) && !(*flags & SB_RDONLY)) {
err = -EROFS;
goto restore_opts;
}
#ifdef CONFIG_QUOTA
if (!f2fs_readonly(sb) && (*flags & SB_RDONLY)) {
err = dquot_suspend(sb, -1);
if (err < 0)
goto restore_opts;
} else if (f2fs_readonly(sb) && !(*flags & SB_RDONLY)) {
/* dquot_resume needs RW */
sb->s_flags &= ~SB_RDONLY;
if (sb_any_quota_suspended(sb)) {
dquot_resume(sb, -1);
} else if (f2fs_sb_has_quota_ino(sbi)) {
err = f2fs_enable_quotas(sb);
if (err)
goto restore_opts;
}
}
#endif
/* disallow enable atgc dynamically */
if (no_atgc == !!test_opt(sbi, ATGC)) {
err = -EINVAL;
f2fs_warn(sbi, "switch atgc option is not allowed");
goto restore_opts;
}
/* disallow enable/disable extent_cache dynamically */
if (no_extent_cache == !!test_opt(sbi, EXTENT_CACHE)) {
err = -EINVAL;
f2fs_warn(sbi, "switch extent_cache option is not allowed");
goto restore_opts;
}
if (no_io_align == !!F2FS_IO_ALIGNED(sbi)) {
err = -EINVAL;
f2fs_warn(sbi, "switch io_bits option is not allowed");
goto restore_opts;
}
if (no_compress_cache == !!test_opt(sbi, COMPRESS_CACHE)) {
err = -EINVAL;
f2fs_warn(sbi, "switch compress_cache option is not allowed");
goto restore_opts;
}
if ((*flags & SB_RDONLY) && test_opt(sbi, DISABLE_CHECKPOINT)) {
err = -EINVAL;
f2fs_warn(sbi, "disabling checkpoint not compatible with read-only");
goto restore_opts;
}
/*
* We stop the GC thread if FS is mounted as RO
* or if background_gc = off is passed in mount
* option. Also sync the filesystem.
*/
if ((*flags & SB_RDONLY) ||
(F2FS_OPTION(sbi).bggc_mode == BGGC_MODE_OFF &&
!test_opt(sbi, GC_MERGE))) {
if (sbi->gc_thread) {
f2fs_stop_gc_thread(sbi);
need_restart_gc = true;
}
} else if (!sbi->gc_thread) {
err = f2fs_start_gc_thread(sbi);
if (err)
goto restore_opts;
need_stop_gc = true;
}
if (*flags & SB_RDONLY ||
F2FS_OPTION(sbi).whint_mode != org_mount_opt.whint_mode) {
sync_inodes_sb(sb);
set_sbi_flag(sbi, SBI_IS_DIRTY);
set_sbi_flag(sbi, SBI_IS_CLOSE);
f2fs_sync_fs(sb, 1);
clear_sbi_flag(sbi, SBI_IS_CLOSE);
}
if ((*flags & SB_RDONLY) || test_opt(sbi, DISABLE_CHECKPOINT) ||
!test_opt(sbi, MERGE_CHECKPOINT)) {
f2fs_stop_ckpt_thread(sbi);
need_restart_ckpt = true;
} else {
/* Flush if the prevous checkpoint, if exists. */
f2fs_flush_ckpt_thread(sbi);
err = f2fs_start_ckpt_thread(sbi);
if (err) {
f2fs_err(sbi,
"Failed to start F2FS issue_checkpoint_thread (%d)",
err);
goto restore_gc;
}
need_stop_ckpt = true;
}
/*
* We stop issue flush thread if FS is mounted as RO
* or if flush_merge is not passed in mount option.
*/
if ((*flags & SB_RDONLY) || !test_opt(sbi, FLUSH_MERGE)) {
clear_opt(sbi, FLUSH_MERGE);
f2fs_destroy_flush_cmd_control(sbi, false);
need_restart_flush = true;
} else {
err = f2fs_create_flush_cmd_control(sbi);
if (err)
goto restore_ckpt;
need_stop_flush = true;
}
if (checkpoint_changed) {
if (test_opt(sbi, DISABLE_CHECKPOINT)) {
err = f2fs_disable_checkpoint(sbi);
if (err)
goto restore_flush;
} else {
f2fs_enable_checkpoint(sbi);
}
}
skip:
#ifdef CONFIG_QUOTA
/* Release old quota file names */
for (i = 0; i < MAXQUOTAS; i++)
kfree(org_mount_opt.s_qf_names[i]);
#endif
/* Update the POSIXACL Flag */
sb->s_flags = (sb->s_flags & ~SB_POSIXACL) |
(test_opt(sbi, POSIX_ACL) ? SB_POSIXACL : 0);
limit_reserve_root(sbi);
adjust_unusable_cap_perc(sbi);
*flags = (*flags & ~SB_LAZYTIME) | (sb->s_flags & SB_LAZYTIME);
return 0;
restore_flush:
if (need_restart_flush) {
if (f2fs_create_flush_cmd_control(sbi))
f2fs_warn(sbi, "background flush thread has stopped");
} else if (need_stop_flush) {
clear_opt(sbi, FLUSH_MERGE);
f2fs_destroy_flush_cmd_control(sbi, false);
}
restore_ckpt:
if (need_restart_ckpt) {
if (f2fs_start_ckpt_thread(sbi))
f2fs_warn(sbi, "background ckpt thread has stopped");
} else if (need_stop_ckpt) {
f2fs_stop_ckpt_thread(sbi);
}
restore_gc:
if (need_restart_gc) {
if (f2fs_start_gc_thread(sbi))
f2fs_warn(sbi, "background gc thread has stopped");
} else if (need_stop_gc) {
f2fs_stop_gc_thread(sbi);
}
restore_opts:
#ifdef CONFIG_QUOTA
F2FS_OPTION(sbi).s_jquota_fmt = org_mount_opt.s_jquota_fmt;
for (i = 0; i < MAXQUOTAS; i++) {
kfree(F2FS_OPTION(sbi).s_qf_names[i]);
F2FS_OPTION(sbi).s_qf_names[i] = org_mount_opt.s_qf_names[i];
}
#endif
sbi->mount_opt = org_mount_opt;
sb->s_flags = old_sb_flags;
return err;
}
#ifdef CONFIG_QUOTA
/* Read data from quotafile */
static ssize_t f2fs_quota_read(struct super_block *sb, int type, char *data,
size_t len, loff_t off)
{
struct inode *inode = sb_dqopt(sb)->files[type];
struct address_space *mapping = inode->i_mapping;
block_t blkidx = F2FS_BYTES_TO_BLK(off);
int offset = off & (sb->s_blocksize - 1);
int tocopy;
size_t toread;
loff_t i_size = i_size_read(inode);
struct page *page;
char *kaddr;
if (off > i_size)
return 0;
if (off + len > i_size)
len = i_size - off;
toread = len;
while (toread > 0) {
tocopy = min_t(unsigned long, sb->s_blocksize - offset, toread);
repeat:
page = read_cache_page_gfp(mapping, blkidx, GFP_NOFS);
if (IS_ERR(page)) {
if (PTR_ERR(page) == -ENOMEM) {
congestion_wait(BLK_RW_ASYNC,
DEFAULT_IO_TIMEOUT);
goto repeat;
}
set_sbi_flag(F2FS_SB(sb), SBI_QUOTA_NEED_REPAIR);
return PTR_ERR(page);
}
lock_page(page);
if (unlikely(page->mapping != mapping)) {
f2fs_put_page(page, 1);
goto repeat;
}
if (unlikely(!PageUptodate(page))) {
f2fs_put_page(page, 1);
set_sbi_flag(F2FS_SB(sb), SBI_QUOTA_NEED_REPAIR);
return -EIO;
}
kaddr = kmap_atomic(page);
memcpy(data, kaddr + offset, tocopy);
kunmap_atomic(kaddr);
f2fs_put_page(page, 1);
offset = 0;
toread -= tocopy;
data += tocopy;
blkidx++;
}
return len;
}
/* Write to quotafile */
static ssize_t f2fs_quota_write(struct super_block *sb, int type,
const char *data, size_t len, loff_t off)
{
struct inode *inode = sb_dqopt(sb)->files[type];
struct address_space *mapping = inode->i_mapping;
const struct address_space_operations *a_ops = mapping->a_ops;
int offset = off & (sb->s_blocksize - 1);
size_t towrite = len;
struct page *page;
void *fsdata = NULL;
char *kaddr;
int err = 0;
int tocopy;
while (towrite > 0) {
tocopy = min_t(unsigned long, sb->s_blocksize - offset,
towrite);
retry:
err = a_ops->write_begin(NULL, mapping, off, tocopy, 0,
&page, &fsdata);
if (unlikely(err)) {
if (err == -ENOMEM) {
congestion_wait(BLK_RW_ASYNC,
DEFAULT_IO_TIMEOUT);
goto retry;
}
set_sbi_flag(F2FS_SB(sb), SBI_QUOTA_NEED_REPAIR);
break;
}
kaddr = kmap_atomic(page);
memcpy(kaddr + offset, data, tocopy);
kunmap_atomic(kaddr);
flush_dcache_page(page);
a_ops->write_end(NULL, mapping, off, tocopy, tocopy,
page, fsdata);
offset = 0;
towrite -= tocopy;
off += tocopy;
data += tocopy;
cond_resched();
}
if (len == towrite)
return err;
inode->i_mtime = inode->i_ctime = current_time(inode);
f2fs_mark_inode_dirty_sync(inode, false);
return len - towrite;
}
static struct dquot **f2fs_get_dquots(struct inode *inode)
{
return F2FS_I(inode)->i_dquot;
}
static qsize_t *f2fs_get_reserved_space(struct inode *inode)
{
return &F2FS_I(inode)->i_reserved_quota;
}
static int f2fs_quota_on_mount(struct f2fs_sb_info *sbi, int type)
{
if (is_set_ckpt_flags(sbi, CP_QUOTA_NEED_FSCK_FLAG)) {
f2fs_err(sbi, "quota sysfile may be corrupted, skip loading it");
return 0;
}
return dquot_quota_on_mount(sbi->sb, F2FS_OPTION(sbi).s_qf_names[type],
F2FS_OPTION(sbi).s_jquota_fmt, type);
}
int f2fs_enable_quota_files(struct f2fs_sb_info *sbi, bool rdonly)
{
int enabled = 0;
int i, err;
if (f2fs_sb_has_quota_ino(sbi) && rdonly) {
err = f2fs_enable_quotas(sbi->sb);
if (err) {
f2fs_err(sbi, "Cannot turn on quota_ino: %d", err);
return 0;
}
return 1;
}
for (i = 0; i < MAXQUOTAS; i++) {
if (F2FS_OPTION(sbi).s_qf_names[i]) {
err = f2fs_quota_on_mount(sbi, i);
if (!err) {
enabled = 1;
continue;
}
f2fs_err(sbi, "Cannot turn on quotas: %d on %d",
err, i);
}
}
return enabled;
}
static int f2fs_quota_enable(struct super_block *sb, int type, int format_id,
unsigned int flags)
{
struct inode *qf_inode;
unsigned long qf_inum;
int err;
BUG_ON(!f2fs_sb_has_quota_ino(F2FS_SB(sb)));
qf_inum = f2fs_qf_ino(sb, type);
if (!qf_inum)
return -EPERM;
qf_inode = f2fs_iget(sb, qf_inum);
if (IS_ERR(qf_inode)) {
f2fs_err(F2FS_SB(sb), "Bad quota inode %u:%lu", type, qf_inum);
return PTR_ERR(qf_inode);
}
/* Don't account quota for quota files to avoid recursion */
qf_inode->i_flags |= S_NOQUOTA;
err = dquot_load_quota_inode(qf_inode, type, format_id, flags);
iput(qf_inode);
return err;
}
static int f2fs_enable_quotas(struct super_block *sb)
{
struct f2fs_sb_info *sbi = F2FS_SB(sb);
int type, err = 0;
unsigned long qf_inum;
bool quota_mopt[MAXQUOTAS] = {
test_opt(sbi, USRQUOTA),
test_opt(sbi, GRPQUOTA),
test_opt(sbi, PRJQUOTA),
};
if (is_set_ckpt_flags(F2FS_SB(sb), CP_QUOTA_NEED_FSCK_FLAG)) {
f2fs_err(sbi, "quota file may be corrupted, skip loading it");
return 0;
}
sb_dqopt(sb)->flags |= DQUOT_QUOTA_SYS_FILE;
for (type = 0; type < MAXQUOTAS; type++) {
qf_inum = f2fs_qf_ino(sb, type);
if (qf_inum) {
err = f2fs_quota_enable(sb, type, QFMT_VFS_V1,
DQUOT_USAGE_ENABLED |
(quota_mopt[type] ? DQUOT_LIMITS_ENABLED : 0));
if (err) {
f2fs_err(sbi, "Failed to enable quota tracking (type=%d, err=%d). Please run fsck to fix.",
type, err);
for (type--; type >= 0; type--)
dquot_quota_off(sb, type);
set_sbi_flag(F2FS_SB(sb),
SBI_QUOTA_NEED_REPAIR);
return err;
}
}
}
return 0;
}
static int f2fs_quota_sync_file(struct f2fs_sb_info *sbi, int type)
{
struct quota_info *dqopt = sb_dqopt(sbi->sb);
struct address_space *mapping = dqopt->files[type]->i_mapping;
int ret = 0;
ret = dquot_writeback_dquots(sbi->sb, type);
if (ret)
goto out;
ret = filemap_fdatawrite(mapping);
if (ret)
goto out;
/* if we are using journalled quota */
if (is_journalled_quota(sbi))
goto out;
ret = filemap_fdatawait(mapping);
truncate_inode_pages(&dqopt->files[type]->i_data, 0);
out:
if (ret)
set_sbi_flag(sbi, SBI_QUOTA_NEED_REPAIR);
return ret;
}
int f2fs_quota_sync(struct super_block *sb, int type)
{
struct f2fs_sb_info *sbi = F2FS_SB(sb);
struct quota_info *dqopt = sb_dqopt(sb);
int cnt;
int ret = 0;
/*
* Now when everything is written we can discard the pagecache so
* that userspace sees the changes.
*/
for (cnt = 0; cnt < MAXQUOTAS; cnt++) {
if (type != -1 && cnt != type)
continue;
if (!sb_has_quota_active(sb, cnt))
continue;
if (!f2fs_sb_has_quota_ino(sbi))
inode_lock(dqopt->files[cnt]);
/*
* do_quotactl
* f2fs_quota_sync
* f2fs_down_read(quota_sem)
* dquot_writeback_dquots()
* f2fs_dquot_commit
* block_operation
* f2fs_down_read(quota_sem)
*/
f2fs_lock_op(sbi);
f2fs_down_read(&sbi->quota_sem);
ret = f2fs_quota_sync_file(sbi, cnt);
f2fs_up_read(&sbi->quota_sem);
f2fs_unlock_op(sbi);
if (!f2fs_sb_has_quota_ino(sbi))
inode_unlock(dqopt->files[cnt]);
if (ret)
break;
}
return ret;
}
static int f2fs_quota_on(struct super_block *sb, int type, int format_id,
const struct path *path)
{
struct inode *inode;
int err;
/* if quota sysfile exists, deny enabling quota with specific file */
if (f2fs_sb_has_quota_ino(F2FS_SB(sb))) {
f2fs_err(F2FS_SB(sb), "quota sysfile already exists");
return -EBUSY;
}
err = f2fs_quota_sync(sb, type);
if (err)
return err;
err = dquot_quota_on(sb, type, format_id, path);
if (err)
return err;
inode = d_inode(path->dentry);
inode_lock(inode);
F2FS_I(inode)->i_flags |= F2FS_NOATIME_FL | F2FS_IMMUTABLE_FL;
f2fs_set_inode_flags(inode);
inode_unlock(inode);
f2fs_mark_inode_dirty_sync(inode, false);
return 0;
}
static int __f2fs_quota_off(struct super_block *sb, int type)
{
struct inode *inode = sb_dqopt(sb)->files[type];
int err;
if (!inode || !igrab(inode))
return dquot_quota_off(sb, type);
err = f2fs_quota_sync(sb, type);
if (err)
goto out_put;
err = dquot_quota_off(sb, type);
if (err || f2fs_sb_has_quota_ino(F2FS_SB(sb)))
goto out_put;
inode_lock(inode);
F2FS_I(inode)->i_flags &= ~(F2FS_NOATIME_FL | F2FS_IMMUTABLE_FL);
f2fs_set_inode_flags(inode);
inode_unlock(inode);
f2fs_mark_inode_dirty_sync(inode, false);
out_put:
iput(inode);
return err;
}
static int f2fs_quota_off(struct super_block *sb, int type)
{
struct f2fs_sb_info *sbi = F2FS_SB(sb);
int err;
err = __f2fs_quota_off(sb, type);
/*
* quotactl can shutdown journalled quota, result in inconsistence
* between quota record and fs data by following updates, tag the
* flag to let fsck be aware of it.
*/
if (is_journalled_quota(sbi))
set_sbi_flag(sbi, SBI_QUOTA_NEED_REPAIR);
return err;
}
void f2fs_quota_off_umount(struct super_block *sb)
{
int type;
int err;
for (type = 0; type < MAXQUOTAS; type++) {
err = __f2fs_quota_off(sb, type);
if (err) {
int ret = dquot_quota_off(sb, type);
f2fs_err(F2FS_SB(sb), "Fail to turn off disk quota (type: %d, err: %d, ret:%d), Please run fsck to fix it.",
type, err, ret);
set_sbi_flag(F2FS_SB(sb), SBI_QUOTA_NEED_REPAIR);
}
}
/*
* In case of checkpoint=disable, we must flush quota blocks.
* This can cause NULL exception for node_inode in end_io, since
* put_super already dropped it.
*/
sync_filesystem(sb);
}
static void f2fs_truncate_quota_inode_pages(struct super_block *sb)
{
struct quota_info *dqopt = sb_dqopt(sb);
int type;
for (type = 0; type < MAXQUOTAS; type++) {
if (!dqopt->files[type])
continue;
f2fs_inode_synced(dqopt->files[type]);
}
}
static int f2fs_dquot_commit(struct dquot *dquot)
{
struct f2fs_sb_info *sbi = F2FS_SB(dquot->dq_sb);
int ret;
f2fs_down_read_nested(&sbi->quota_sem, SINGLE_DEPTH_NESTING);
ret = dquot_commit(dquot);
if (ret < 0)
set_sbi_flag(sbi, SBI_QUOTA_NEED_REPAIR);
f2fs_up_read(&sbi->quota_sem);
return ret;
}
static int f2fs_dquot_acquire(struct dquot *dquot)
{
struct f2fs_sb_info *sbi = F2FS_SB(dquot->dq_sb);
int ret;
f2fs_down_read(&sbi->quota_sem);
ret = dquot_acquire(dquot);
if (ret < 0)
set_sbi_flag(sbi, SBI_QUOTA_NEED_REPAIR);
f2fs_up_read(&sbi->quota_sem);
return ret;
}
static int f2fs_dquot_release(struct dquot *dquot)
{
struct f2fs_sb_info *sbi = F2FS_SB(dquot->dq_sb);
int ret = dquot_release(dquot);
if (ret < 0)
set_sbi_flag(sbi, SBI_QUOTA_NEED_REPAIR);
return ret;
}
static int f2fs_dquot_mark_dquot_dirty(struct dquot *dquot)
{
struct super_block *sb = dquot->dq_sb;
struct f2fs_sb_info *sbi = F2FS_SB(sb);
int ret = dquot_mark_dquot_dirty(dquot);
/* if we are using journalled quota */
if (is_journalled_quota(sbi))
set_sbi_flag(sbi, SBI_QUOTA_NEED_FLUSH);
return ret;
}
static int f2fs_dquot_commit_info(struct super_block *sb, int type)
{
struct f2fs_sb_info *sbi = F2FS_SB(sb);
int ret = dquot_commit_info(sb, type);
if (ret < 0)
set_sbi_flag(sbi, SBI_QUOTA_NEED_REPAIR);
return ret;
}
static int f2fs_get_projid(struct inode *inode, kprojid_t *projid)
{
*projid = F2FS_I(inode)->i_projid;
return 0;
}
static const struct dquot_operations f2fs_quota_operations = {
.get_reserved_space = f2fs_get_reserved_space,
.write_dquot = f2fs_dquot_commit,
.acquire_dquot = f2fs_dquot_acquire,
.release_dquot = f2fs_dquot_release,
.mark_dirty = f2fs_dquot_mark_dquot_dirty,
.write_info = f2fs_dquot_commit_info,
.alloc_dquot = dquot_alloc,
.destroy_dquot = dquot_destroy,
.get_projid = f2fs_get_projid,
.get_next_id = dquot_get_next_id,
};
static const struct quotactl_ops f2fs_quotactl_ops = {
.quota_on = f2fs_quota_on,
.quota_off = f2fs_quota_off,
.quota_sync = f2fs_quota_sync,
.get_state = dquot_get_state,
.set_info = dquot_set_dqinfo,
.get_dqblk = dquot_get_dqblk,
.set_dqblk = dquot_set_dqblk,
.get_nextdqblk = dquot_get_next_dqblk,
};
#else
int f2fs_quota_sync(struct super_block *sb, int type)
{
return 0;
}
void f2fs_quota_off_umount(struct super_block *sb)
{
}
#endif
static const struct super_operations f2fs_sops = {
.alloc_inode = f2fs_alloc_inode,
.free_inode = f2fs_free_inode,
.drop_inode = f2fs_drop_inode,
.write_inode = f2fs_write_inode,
.dirty_inode = f2fs_dirty_inode,
.show_options = f2fs_show_options,
#ifdef CONFIG_QUOTA
.quota_read = f2fs_quota_read,
.quota_write = f2fs_quota_write,
.get_dquots = f2fs_get_dquots,
#endif
.evict_inode = f2fs_evict_inode,
.put_super = f2fs_put_super,
.sync_fs = f2fs_sync_fs,
.freeze_fs = f2fs_freeze,
.unfreeze_fs = f2fs_unfreeze,
.statfs = f2fs_statfs,
.remount_fs = f2fs_remount,
};
#ifdef CONFIG_FS_ENCRYPTION
static int f2fs_get_context(struct inode *inode, void *ctx, size_t len)
{
return f2fs_getxattr(inode, F2FS_XATTR_INDEX_ENCRYPTION,
F2FS_XATTR_NAME_ENCRYPTION_CONTEXT,
ctx, len, NULL);
}
static int f2fs_set_context(struct inode *inode, const void *ctx, size_t len,
void *fs_data)
{
struct f2fs_sb_info *sbi = F2FS_I_SB(inode);
/*
* Encrypting the root directory is not allowed because fsck
* expects lost+found directory to exist and remain unencrypted
* if LOST_FOUND feature is enabled.
*
*/
if (f2fs_sb_has_lost_found(sbi) &&
inode->i_ino == F2FS_ROOT_INO(sbi))
return -EPERM;
return f2fs_setxattr(inode, F2FS_XATTR_INDEX_ENCRYPTION,
F2FS_XATTR_NAME_ENCRYPTION_CONTEXT,
ctx, len, fs_data, XATTR_CREATE);
}
static const union fscrypt_policy *f2fs_get_dummy_policy(struct super_block *sb)
{
return F2FS_OPTION(F2FS_SB(sb)).dummy_enc_policy.policy;
}
static bool f2fs_has_stable_inodes(struct super_block *sb)
{
return true;
}
static void f2fs_get_ino_and_lblk_bits(struct super_block *sb,
int *ino_bits_ret, int *lblk_bits_ret)
{
*ino_bits_ret = 8 * sizeof(nid_t);
*lblk_bits_ret = 8 * sizeof(block_t);
}
static int f2fs_get_num_devices(struct super_block *sb)
{
struct f2fs_sb_info *sbi = F2FS_SB(sb);
if (f2fs_is_multi_device(sbi))
return sbi->s_ndevs;
return 1;
}
static void f2fs_get_devices(struct super_block *sb,
struct request_queue **devs)
{
struct f2fs_sb_info *sbi = F2FS_SB(sb);
int i;
for (i = 0; i < sbi->s_ndevs; i++)
devs[i] = bdev_get_queue(FDEV(i).bdev);
}
static const struct fscrypt_operations f2fs_cryptops = {
.key_prefix = "f2fs:",
.get_context = f2fs_get_context,
.set_context = f2fs_set_context,
.get_dummy_policy = f2fs_get_dummy_policy,
.empty_dir = f2fs_empty_dir,
.max_namelen = F2FS_NAME_LEN,
.has_stable_inodes = f2fs_has_stable_inodes,
.get_ino_and_lblk_bits = f2fs_get_ino_and_lblk_bits,
.get_num_devices = f2fs_get_num_devices,
.get_devices = f2fs_get_devices,
};
#endif
static struct inode *f2fs_nfs_get_inode(struct super_block *sb,
u64 ino, u32 generation)
{
struct f2fs_sb_info *sbi = F2FS_SB(sb);
struct inode *inode;
if (f2fs_check_nid_range(sbi, ino))
return ERR_PTR(-ESTALE);
/*
* f2fs_iget isn't quite right if the inode is currently unallocated!
* However f2fs_iget currently does appropriate checks to handle stale
* inodes so everything is OK.
*/
inode = f2fs_iget(sb, ino);
if (IS_ERR(inode))
return ERR_CAST(inode);
if (unlikely(generation && inode->i_generation != generation)) {
/* we didn't find the right inode.. */
iput(inode);
return ERR_PTR(-ESTALE);
}
return inode;
}
static struct dentry *f2fs_fh_to_dentry(struct super_block *sb, struct fid *fid,
int fh_len, int fh_type)
{
return generic_fh_to_dentry(sb, fid, fh_len, fh_type,
f2fs_nfs_get_inode);
}
static struct dentry *f2fs_fh_to_parent(struct super_block *sb, struct fid *fid,
int fh_len, int fh_type)
{
return generic_fh_to_parent(sb, fid, fh_len, fh_type,
f2fs_nfs_get_inode);
}
static const struct export_operations f2fs_export_ops = {
.fh_to_dentry = f2fs_fh_to_dentry,
.fh_to_parent = f2fs_fh_to_parent,
.get_parent = f2fs_get_parent,
};
loff_t max_file_blocks(struct inode *inode)
{
loff_t result = 0;
loff_t leaf_count;
/*
* note: previously, result is equal to (DEF_ADDRS_PER_INODE -
* DEFAULT_INLINE_XATTR_ADDRS), but now f2fs try to reserve more
* space in inode.i_addr, it will be more safe to reassign
* result as zero.
*/
if (inode && f2fs_compressed_file(inode))
leaf_count = ADDRS_PER_BLOCK(inode);
else
leaf_count = DEF_ADDRS_PER_BLOCK;
/* two direct node blocks */
result += (leaf_count * 2);
/* two indirect node blocks */
leaf_count *= NIDS_PER_BLOCK;
result += (leaf_count * 2);
/* one double indirect node block */
leaf_count *= NIDS_PER_BLOCK;
result += leaf_count;
return result;
}
static int __f2fs_commit_super(struct buffer_head *bh,
struct f2fs_super_block *super)
{
lock_buffer(bh);
if (super)
memcpy(bh->b_data + F2FS_SUPER_OFFSET, super, sizeof(*super));
set_buffer_dirty(bh);
unlock_buffer(bh);
/* it's rare case, we can do fua all the time */
return __sync_dirty_buffer(bh, REQ_SYNC | REQ_PREFLUSH | REQ_FUA);
}
static inline bool sanity_check_area_boundary(struct f2fs_sb_info *sbi,
struct buffer_head *bh)
{
struct f2fs_super_block *raw_super = (struct f2fs_super_block *)
(bh->b_data + F2FS_SUPER_OFFSET);
struct super_block *sb = sbi->sb;
u32 segment0_blkaddr = le32_to_cpu(raw_super->segment0_blkaddr);
u32 cp_blkaddr = le32_to_cpu(raw_super->cp_blkaddr);
u32 sit_blkaddr = le32_to_cpu(raw_super->sit_blkaddr);
u32 nat_blkaddr = le32_to_cpu(raw_super->nat_blkaddr);
u32 ssa_blkaddr = le32_to_cpu(raw_super->ssa_blkaddr);
u32 main_blkaddr = le32_to_cpu(raw_super->main_blkaddr);
u32 segment_count_ckpt = le32_to_cpu(raw_super->segment_count_ckpt);
u32 segment_count_sit = le32_to_cpu(raw_super->segment_count_sit);
u32 segment_count_nat = le32_to_cpu(raw_super->segment_count_nat);
u32 segment_count_ssa = le32_to_cpu(raw_super->segment_count_ssa);
u32 segment_count_main = le32_to_cpu(raw_super->segment_count_main);
u32 segment_count = le32_to_cpu(raw_super->segment_count);
u32 log_blocks_per_seg = le32_to_cpu(raw_super->log_blocks_per_seg);
u64 main_end_blkaddr = main_blkaddr +
(segment_count_main << log_blocks_per_seg);
u64 seg_end_blkaddr = segment0_blkaddr +
(segment_count << log_blocks_per_seg);
if (segment0_blkaddr != cp_blkaddr) {
f2fs_info(sbi, "Mismatch start address, segment0(%u) cp_blkaddr(%u)",
segment0_blkaddr, cp_blkaddr);
return true;
}
if (cp_blkaddr + (segment_count_ckpt << log_blocks_per_seg) !=
sit_blkaddr) {
f2fs_info(sbi, "Wrong CP boundary, start(%u) end(%u) blocks(%u)",
cp_blkaddr, sit_blkaddr,
segment_count_ckpt << log_blocks_per_seg);
return true;
}
if (sit_blkaddr + (segment_count_sit << log_blocks_per_seg) !=
nat_blkaddr) {
f2fs_info(sbi, "Wrong SIT boundary, start(%u) end(%u) blocks(%u)",
sit_blkaddr, nat_blkaddr,
segment_count_sit << log_blocks_per_seg);
return true;
}
if (nat_blkaddr + (segment_count_nat << log_blocks_per_seg) !=
ssa_blkaddr) {
f2fs_info(sbi, "Wrong NAT boundary, start(%u) end(%u) blocks(%u)",
nat_blkaddr, ssa_blkaddr,
segment_count_nat << log_blocks_per_seg);
return true;
}
if (ssa_blkaddr + (segment_count_ssa << log_blocks_per_seg) !=
main_blkaddr) {
f2fs_info(sbi, "Wrong SSA boundary, start(%u) end(%u) blocks(%u)",
ssa_blkaddr, main_blkaddr,
segment_count_ssa << log_blocks_per_seg);
return true;
}
if (main_end_blkaddr > seg_end_blkaddr) {
f2fs_info(sbi, "Wrong MAIN_AREA boundary, start(%u) end(%llu) block(%u)",
main_blkaddr, seg_end_blkaddr,
segment_count_main << log_blocks_per_seg);
return true;
} else if (main_end_blkaddr < seg_end_blkaddr) {
int err = 0;
char *res;
/* fix in-memory information all the time */
raw_super->segment_count = cpu_to_le32((main_end_blkaddr -
segment0_blkaddr) >> log_blocks_per_seg);
if (f2fs_readonly(sb) || bdev_read_only(sb->s_bdev)) {
set_sbi_flag(sbi, SBI_NEED_SB_WRITE);
res = "internally";
} else {
err = __f2fs_commit_super(bh, NULL);
res = err ? "failed" : "done";
}
f2fs_info(sbi, "Fix alignment : %s, start(%u) end(%llu) block(%u)",
res, main_blkaddr, seg_end_blkaddr,
segment_count_main << log_blocks_per_seg);
if (err)
return true;
}
return false;
}
static int sanity_check_raw_super(struct f2fs_sb_info *sbi,
struct buffer_head *bh)
{
block_t segment_count, segs_per_sec, secs_per_zone, segment_count_main;
block_t total_sections, blocks_per_seg;
struct f2fs_super_block *raw_super = (struct f2fs_super_block *)
(bh->b_data + F2FS_SUPER_OFFSET);
size_t crc_offset = 0;
__u32 crc = 0;
if (le32_to_cpu(raw_super->magic) != F2FS_SUPER_MAGIC) {
f2fs_info(sbi, "Magic Mismatch, valid(0x%x) - read(0x%x)",
F2FS_SUPER_MAGIC, le32_to_cpu(raw_super->magic));
return -EINVAL;
}
/* Check checksum_offset and crc in superblock */
if (__F2FS_HAS_FEATURE(raw_super, F2FS_FEATURE_SB_CHKSUM)) {
crc_offset = le32_to_cpu(raw_super->checksum_offset);
if (crc_offset !=
offsetof(struct f2fs_super_block, crc)) {
f2fs_info(sbi, "Invalid SB checksum offset: %zu",
crc_offset);
return -EFSCORRUPTED;
}
crc = le32_to_cpu(raw_super->crc);
if (!f2fs_crc_valid(sbi, crc, raw_super, crc_offset)) {
f2fs_info(sbi, "Invalid SB checksum value: %u", crc);
return -EFSCORRUPTED;
}
}
/* Currently, support only 4KB block size */
if (le32_to_cpu(raw_super->log_blocksize) != F2FS_BLKSIZE_BITS) {
f2fs_info(sbi, "Invalid log_blocksize (%u), supports only %u",
le32_to_cpu(raw_super->log_blocksize),
F2FS_BLKSIZE_BITS);
return -EFSCORRUPTED;
}
/* check log blocks per segment */
if (le32_to_cpu(raw_super->log_blocks_per_seg) != 9) {
f2fs_info(sbi, "Invalid log blocks per segment (%u)",
le32_to_cpu(raw_super->log_blocks_per_seg));
return -EFSCORRUPTED;
}
/* Currently, support 512/1024/2048/4096 bytes sector size */
if (le32_to_cpu(raw_super->log_sectorsize) >
F2FS_MAX_LOG_SECTOR_SIZE ||
le32_to_cpu(raw_super->log_sectorsize) <
F2FS_MIN_LOG_SECTOR_SIZE) {
f2fs_info(sbi, "Invalid log sectorsize (%u)",
le32_to_cpu(raw_super->log_sectorsize));
return -EFSCORRUPTED;
}
if (le32_to_cpu(raw_super->log_sectors_per_block) +
le32_to_cpu(raw_super->log_sectorsize) !=
F2FS_MAX_LOG_SECTOR_SIZE) {
f2fs_info(sbi, "Invalid log sectors per block(%u) log sectorsize(%u)",
le32_to_cpu(raw_super->log_sectors_per_block),
le32_to_cpu(raw_super->log_sectorsize));
return -EFSCORRUPTED;
}
segment_count = le32_to_cpu(raw_super->segment_count);
segment_count_main = le32_to_cpu(raw_super->segment_count_main);
segs_per_sec = le32_to_cpu(raw_super->segs_per_sec);
secs_per_zone = le32_to_cpu(raw_super->secs_per_zone);
total_sections = le32_to_cpu(raw_super->section_count);
/* blocks_per_seg should be 512, given the above check */
blocks_per_seg = 1 << le32_to_cpu(raw_super->log_blocks_per_seg);
if (segment_count > F2FS_MAX_SEGMENT ||
segment_count < F2FS_MIN_SEGMENTS) {
f2fs_info(sbi, "Invalid segment count (%u)", segment_count);
return -EFSCORRUPTED;
}
if (total_sections > segment_count_main || total_sections < 1 ||
segs_per_sec > segment_count || !segs_per_sec) {
f2fs_info(sbi, "Invalid segment/section count (%u, %u x %u)",
segment_count, total_sections, segs_per_sec);
return -EFSCORRUPTED;
}
if (segment_count_main != total_sections * segs_per_sec) {
f2fs_info(sbi, "Invalid segment/section count (%u != %u * %u)",
segment_count_main, total_sections, segs_per_sec);
return -EFSCORRUPTED;
}
if ((segment_count / segs_per_sec) < total_sections) {
f2fs_info(sbi, "Small segment_count (%u < %u * %u)",
segment_count, segs_per_sec, total_sections);
return -EFSCORRUPTED;
}
if (segment_count > (le64_to_cpu(raw_super->block_count) >> 9)) {
f2fs_info(sbi, "Wrong segment_count / block_count (%u > %llu)",
segment_count, le64_to_cpu(raw_super->block_count));
return -EFSCORRUPTED;
}
if (RDEV(0).path[0]) {
block_t dev_seg_count = le32_to_cpu(RDEV(0).total_segments);
int i = 1;
while (i < MAX_DEVICES && RDEV(i).path[0]) {
dev_seg_count += le32_to_cpu(RDEV(i).total_segments);
i++;
}
if (segment_count != dev_seg_count) {
f2fs_info(sbi, "Segment count (%u) mismatch with total segments from devices (%u)",
segment_count, dev_seg_count);
return -EFSCORRUPTED;
}
} else {
if (__F2FS_HAS_FEATURE(raw_super, F2FS_FEATURE_BLKZONED) &&
!bdev_is_zoned(sbi->sb->s_bdev)) {
f2fs_info(sbi, "Zoned block device path is missing");
return -EFSCORRUPTED;
}
}
if (secs_per_zone > total_sections || !secs_per_zone) {
f2fs_info(sbi, "Wrong secs_per_zone / total_sections (%u, %u)",
secs_per_zone, total_sections);
return -EFSCORRUPTED;
}
if (le32_to_cpu(raw_super->extension_count) > F2FS_MAX_EXTENSION ||
raw_super->hot_ext_count > F2FS_MAX_EXTENSION ||
(le32_to_cpu(raw_super->extension_count) +
raw_super->hot_ext_count) > F2FS_MAX_EXTENSION) {
f2fs_info(sbi, "Corrupted extension count (%u + %u > %u)",
le32_to_cpu(raw_super->extension_count),
raw_super->hot_ext_count,
F2FS_MAX_EXTENSION);
return -EFSCORRUPTED;
}
if (le32_to_cpu(raw_super->cp_payload) >=
(blocks_per_seg - F2FS_CP_PACKS -
NR_CURSEG_PERSIST_TYPE)) {
f2fs_info(sbi, "Insane cp_payload (%u >= %u)",
le32_to_cpu(raw_super->cp_payload),
blocks_per_seg - F2FS_CP_PACKS -
NR_CURSEG_PERSIST_TYPE);
return -EFSCORRUPTED;
}
/* check reserved ino info */
if (le32_to_cpu(raw_super->node_ino) != 1 ||
le32_to_cpu(raw_super->meta_ino) != 2 ||
le32_to_cpu(raw_super->root_ino) != 3) {
f2fs_info(sbi, "Invalid Fs Meta Ino: node(%u) meta(%u) root(%u)",
le32_to_cpu(raw_super->node_ino),
le32_to_cpu(raw_super->meta_ino),
le32_to_cpu(raw_super->root_ino));
return -EFSCORRUPTED;
}
/* check CP/SIT/NAT/SSA/MAIN_AREA area boundary */
if (sanity_check_area_boundary(sbi, bh))
return -EFSCORRUPTED;
return 0;
}
int f2fs_sanity_check_ckpt(struct f2fs_sb_info *sbi)
{
unsigned int total, fsmeta;
struct f2fs_super_block *raw_super = F2FS_RAW_SUPER(sbi);
struct f2fs_checkpoint *ckpt = F2FS_CKPT(sbi);
unsigned int ovp_segments, reserved_segments;
unsigned int main_segs, blocks_per_seg;
unsigned int sit_segs, nat_segs;
unsigned int sit_bitmap_size, nat_bitmap_size;
unsigned int log_blocks_per_seg;
unsigned int segment_count_main;
unsigned int cp_pack_start_sum, cp_payload;
block_t user_block_count, valid_user_blocks;
block_t avail_node_count, valid_node_count;
unsigned int nat_blocks, nat_bits_bytes, nat_bits_blocks;
int i, j;
total = le32_to_cpu(raw_super->segment_count);
fsmeta = le32_to_cpu(raw_super->segment_count_ckpt);
sit_segs = le32_to_cpu(raw_super->segment_count_sit);
fsmeta += sit_segs;
nat_segs = le32_to_cpu(raw_super->segment_count_nat);
fsmeta += nat_segs;
fsmeta += le32_to_cpu(ckpt->rsvd_segment_count);
fsmeta += le32_to_cpu(raw_super->segment_count_ssa);
if (unlikely(fsmeta >= total))
return 1;
ovp_segments = le32_to_cpu(ckpt->overprov_segment_count);
reserved_segments = le32_to_cpu(ckpt->rsvd_segment_count);
if (!f2fs_sb_has_readonly(sbi) &&
unlikely(fsmeta < F2FS_MIN_META_SEGMENTS ||
ovp_segments == 0 || reserved_segments == 0)) {
f2fs_err(sbi, "Wrong layout: check mkfs.f2fs version");
return 1;
}
user_block_count = le64_to_cpu(ckpt->user_block_count);
segment_count_main = le32_to_cpu(raw_super->segment_count_main) +
(f2fs_sb_has_readonly(sbi) ? 1 : 0);
log_blocks_per_seg = le32_to_cpu(raw_super->log_blocks_per_seg);
if (!user_block_count || user_block_count >=
segment_count_main << log_blocks_per_seg) {
f2fs_err(sbi, "Wrong user_block_count: %u",
user_block_count);
return 1;
}
valid_user_blocks = le64_to_cpu(ckpt->valid_block_count);
if (valid_user_blocks > user_block_count) {
f2fs_err(sbi, "Wrong valid_user_blocks: %u, user_block_count: %u",
valid_user_blocks, user_block_count);
return 1;
}
valid_node_count = le32_to_cpu(ckpt->valid_node_count);
avail_node_count = sbi->total_node_count - F2FS_RESERVED_NODE_NUM;
if (valid_node_count > avail_node_count) {
f2fs_err(sbi, "Wrong valid_node_count: %u, avail_node_count: %u",
valid_node_count, avail_node_count);
return 1;
}
main_segs = le32_to_cpu(raw_super->segment_count_main);
blocks_per_seg = sbi->blocks_per_seg;
for (i = 0; i < NR_CURSEG_NODE_TYPE; i++) {
if (le32_to_cpu(ckpt->cur_node_segno[i]) >= main_segs ||
le16_to_cpu(ckpt->cur_node_blkoff[i]) >= blocks_per_seg)
return 1;
if (f2fs_sb_has_readonly(sbi))
goto check_data;
for (j = i + 1; j < NR_CURSEG_NODE_TYPE; j++) {
if (le32_to_cpu(ckpt->cur_node_segno[i]) ==
le32_to_cpu(ckpt->cur_node_segno[j])) {
f2fs_err(sbi, "Node segment (%u, %u) has the same segno: %u",
i, j,
le32_to_cpu(ckpt->cur_node_segno[i]));
return 1;
}
}
}
check_data:
for (i = 0; i < NR_CURSEG_DATA_TYPE; i++) {
if (le32_to_cpu(ckpt->cur_data_segno[i]) >= main_segs ||
le16_to_cpu(ckpt->cur_data_blkoff[i]) >= blocks_per_seg)
return 1;
if (f2fs_sb_has_readonly(sbi))
goto skip_cross;
for (j = i + 1; j < NR_CURSEG_DATA_TYPE; j++) {
if (le32_to_cpu(ckpt->cur_data_segno[i]) ==
le32_to_cpu(ckpt->cur_data_segno[j])) {
f2fs_err(sbi, "Data segment (%u, %u) has the same segno: %u",
i, j,
le32_to_cpu(ckpt->cur_data_segno[i]));
return 1;
}
}
}
for (i = 0; i < NR_CURSEG_NODE_TYPE; i++) {
for (j = 0; j < NR_CURSEG_DATA_TYPE; j++) {
if (le32_to_cpu(ckpt->cur_node_segno[i]) ==
le32_to_cpu(ckpt->cur_data_segno[j])) {
f2fs_err(sbi, "Node segment (%u) and Data segment (%u) has the same segno: %u",
i, j,
le32_to_cpu(ckpt->cur_node_segno[i]));
return 1;
}
}
}
skip_cross:
sit_bitmap_size = le32_to_cpu(ckpt->sit_ver_bitmap_bytesize);
nat_bitmap_size = le32_to_cpu(ckpt->nat_ver_bitmap_bytesize);
if (sit_bitmap_size != ((sit_segs / 2) << log_blocks_per_seg) / 8 ||
nat_bitmap_size != ((nat_segs / 2) << log_blocks_per_seg) / 8) {
f2fs_err(sbi, "Wrong bitmap size: sit: %u, nat:%u",
sit_bitmap_size, nat_bitmap_size);
return 1;
}
cp_pack_start_sum = __start_sum_addr(sbi);
cp_payload = __cp_payload(sbi);
if (cp_pack_start_sum < cp_payload + 1 ||
cp_pack_start_sum > blocks_per_seg - 1 -
NR_CURSEG_PERSIST_TYPE) {
f2fs_err(sbi, "Wrong cp_pack_start_sum: %u",
cp_pack_start_sum);
return 1;
}
if (__is_set_ckpt_flags(ckpt, CP_LARGE_NAT_BITMAP_FLAG) &&
le32_to_cpu(ckpt->checksum_offset) != CP_MIN_CHKSUM_OFFSET) {
f2fs_warn(sbi, "using deprecated layout of large_nat_bitmap, "
"please run fsck v1.13.0 or higher to repair, chksum_offset: %u, "
"fixed with patch: \"f2fs-tools: relocate chksum_offset for large_nat_bitmap feature\"",
le32_to_cpu(ckpt->checksum_offset));
return 1;
}
nat_blocks = nat_segs << log_blocks_per_seg;
nat_bits_bytes = nat_blocks / BITS_PER_BYTE;
nat_bits_blocks = F2FS_BLK_ALIGN((nat_bits_bytes << 1) + 8);
if (__is_set_ckpt_flags(ckpt, CP_NAT_BITS_FLAG) &&
(cp_payload + F2FS_CP_PACKS +
NR_CURSEG_PERSIST_TYPE + nat_bits_blocks >= blocks_per_seg)) {
f2fs_warn(sbi, "Insane cp_payload: %u, nat_bits_blocks: %u)",
cp_payload, nat_bits_blocks);
return 1;
}
if (unlikely(f2fs_cp_error(sbi))) {
f2fs_err(sbi, "A bug case: need to run fsck");
return 1;
}
return 0;
}
static void init_sb_info(struct f2fs_sb_info *sbi)
{
struct f2fs_super_block *raw_super = sbi->raw_super;
int i;
sbi->log_sectors_per_block =
le32_to_cpu(raw_super->log_sectors_per_block);
sbi->log_blocksize = le32_to_cpu(raw_super->log_blocksize);
sbi->blocksize = 1 << sbi->log_blocksize;
sbi->log_blocks_per_seg = le32_to_cpu(raw_super->log_blocks_per_seg);
sbi->blocks_per_seg = 1 << sbi->log_blocks_per_seg;
sbi->segs_per_sec = le32_to_cpu(raw_super->segs_per_sec);
sbi->secs_per_zone = le32_to_cpu(raw_super->secs_per_zone);
sbi->total_sections = le32_to_cpu(raw_super->section_count);
sbi->total_node_count =
(le32_to_cpu(raw_super->segment_count_nat) / 2)
* sbi->blocks_per_seg * NAT_ENTRY_PER_BLOCK;
F2FS_ROOT_INO(sbi) = le32_to_cpu(raw_super->root_ino);
F2FS_NODE_INO(sbi) = le32_to_cpu(raw_super->node_ino);
F2FS_META_INO(sbi) = le32_to_cpu(raw_super->meta_ino);
sbi->cur_victim_sec = NULL_SECNO;
sbi->next_victim_seg[BG_GC] = NULL_SEGNO;
sbi->next_victim_seg[FG_GC] = NULL_SEGNO;
sbi->max_victim_search = DEF_MAX_VICTIM_SEARCH;
sbi->migration_granularity = sbi->segs_per_sec;
sbi->dir_level = DEF_DIR_LEVEL;
sbi->interval_time[CP_TIME] = DEF_CP_INTERVAL;
sbi->interval_time[REQ_TIME] = DEF_IDLE_INTERVAL;
sbi->interval_time[DISCARD_TIME] = DEF_IDLE_INTERVAL;
sbi->interval_time[GC_TIME] = DEF_IDLE_INTERVAL;
sbi->interval_time[DISABLE_TIME] = DEF_DISABLE_INTERVAL;
sbi->interval_time[UMOUNT_DISCARD_TIMEOUT] =
DEF_UMOUNT_DISCARD_TIMEOUT;
clear_sbi_flag(sbi, SBI_NEED_FSCK);
for (i = 0; i < NR_COUNT_TYPE; i++)
atomic_set(&sbi->nr_pages[i], 0);
for (i = 0; i < META; i++)
atomic_set(&sbi->wb_sync_req[i], 0);
INIT_LIST_HEAD(&sbi->s_list);
mutex_init(&sbi->umount_mutex);
init_f2fs_rwsem(&sbi->io_order_lock);
spin_lock_init(&sbi->cp_lock);
sbi->dirty_device = 0;
spin_lock_init(&sbi->dev_lock);
init_f2fs_rwsem(&sbi->sb_lock);
init_f2fs_rwsem(&sbi->pin_sem);
}
static int init_percpu_info(struct f2fs_sb_info *sbi)
{
int err;
err = percpu_counter_init(&sbi->alloc_valid_block_count, 0, GFP_KERNEL);
if (err)
return err;
err = percpu_counter_init(&sbi->total_valid_inode_count, 0,
GFP_KERNEL);
if (err)
percpu_counter_destroy(&sbi->alloc_valid_block_count);
return err;
}
#ifdef CONFIG_BLK_DEV_ZONED
struct f2fs_report_zones_args {
struct f2fs_dev_info *dev;
bool zone_cap_mismatch;
};
static int f2fs_report_zone_cb(struct blk_zone *zone, unsigned int idx,
void *data)
{
struct f2fs_report_zones_args *rz_args = data;
if (zone->type == BLK_ZONE_TYPE_CONVENTIONAL)
return 0;
set_bit(idx, rz_args->dev->blkz_seq);
rz_args->dev->zone_capacity_blocks[idx] = zone->capacity >>
F2FS_LOG_SECTORS_PER_BLOCK;
if (zone->len != zone->capacity && !rz_args->zone_cap_mismatch)
rz_args->zone_cap_mismatch = true;
return 0;
}
static int init_blkz_info(struct f2fs_sb_info *sbi, int devi)
{
struct block_device *bdev = FDEV(devi).bdev;
sector_t nr_sectors = bdev->bd_part->nr_sects;
struct f2fs_report_zones_args rep_zone_arg;
int ret;
if (!f2fs_sb_has_blkzoned(sbi))
return 0;
if (sbi->blocks_per_blkz && sbi->blocks_per_blkz !=
SECTOR_TO_BLOCK(bdev_zone_sectors(bdev)))
return -EINVAL;
sbi->blocks_per_blkz = SECTOR_TO_BLOCK(bdev_zone_sectors(bdev));
if (sbi->log_blocks_per_blkz && sbi->log_blocks_per_blkz !=
__ilog2_u32(sbi->blocks_per_blkz))
return -EINVAL;
sbi->log_blocks_per_blkz = __ilog2_u32(sbi->blocks_per_blkz);
FDEV(devi).nr_blkz = SECTOR_TO_BLOCK(nr_sectors) >>
sbi->log_blocks_per_blkz;
if (nr_sectors & (bdev_zone_sectors(bdev) - 1))
FDEV(devi).nr_blkz++;
FDEV(devi).blkz_seq = f2fs_kvzalloc(sbi,
BITS_TO_LONGS(FDEV(devi).nr_blkz)
* sizeof(unsigned long),
GFP_KERNEL);
if (!FDEV(devi).blkz_seq)
return -ENOMEM;
/* Get block zones type and zone-capacity */
FDEV(devi).zone_capacity_blocks = f2fs_kzalloc(sbi,
FDEV(devi).nr_blkz * sizeof(block_t),
GFP_KERNEL);
if (!FDEV(devi).zone_capacity_blocks)
return -ENOMEM;
rep_zone_arg.dev = &FDEV(devi);
rep_zone_arg.zone_cap_mismatch = false;
ret = blkdev_report_zones(bdev, 0, BLK_ALL_ZONES, f2fs_report_zone_cb,
&rep_zone_arg);
if (ret < 0)
return ret;
if (!rep_zone_arg.zone_cap_mismatch) {
kfree(FDEV(devi).zone_capacity_blocks);
FDEV(devi).zone_capacity_blocks = NULL;
}
return 0;
}
#endif
/*
* Read f2fs raw super block.
* Because we have two copies of super block, so read both of them
* to get the first valid one. If any one of them is broken, we pass
* them recovery flag back to the caller.
*/
static int read_raw_super_block(struct f2fs_sb_info *sbi,
struct f2fs_super_block **raw_super,
int *valid_super_block, int *recovery)
{
struct super_block *sb = sbi->sb;
int block;
struct buffer_head *bh;
struct f2fs_super_block *super;
int err = 0;
super = kzalloc(sizeof(struct f2fs_super_block), GFP_KERNEL);
if (!super)
return -ENOMEM;
for (block = 0; block < 2; block++) {
bh = sb_bread(sb, block);
if (!bh) {
f2fs_err(sbi, "Unable to read %dth superblock",
block + 1);
err = -EIO;
*recovery = 1;
continue;
}
/* sanity checking of raw super */
err = sanity_check_raw_super(sbi, bh);
if (err) {
f2fs_err(sbi, "Can't find valid F2FS filesystem in %dth superblock",
block + 1);
brelse(bh);
*recovery = 1;
continue;
}
if (!*raw_super) {
memcpy(super, bh->b_data + F2FS_SUPER_OFFSET,
sizeof(*super));
*valid_super_block = block;
*raw_super = super;
}
brelse(bh);
}
/* No valid superblock */
if (!*raw_super)
kfree(super);
else
err = 0;
return err;
}
int f2fs_commit_super(struct f2fs_sb_info *sbi, bool recover)
{
struct buffer_head *bh;
__u32 crc = 0;
int err;
if ((recover && f2fs_readonly(sbi->sb)) ||
bdev_read_only(sbi->sb->s_bdev)) {
set_sbi_flag(sbi, SBI_NEED_SB_WRITE);
return -EROFS;
}
/* we should update superblock crc here */
if (!recover && f2fs_sb_has_sb_chksum(sbi)) {
crc = f2fs_crc32(sbi, F2FS_RAW_SUPER(sbi),
offsetof(struct f2fs_super_block, crc));
F2FS_RAW_SUPER(sbi)->crc = cpu_to_le32(crc);
}
/* write back-up superblock first */
bh = sb_bread(sbi->sb, sbi->valid_super_block ? 0 : 1);
if (!bh)
return -EIO;
err = __f2fs_commit_super(bh, F2FS_RAW_SUPER(sbi));
brelse(bh);
/* if we are in recovery path, skip writing valid superblock */
if (recover || err)
return err;
/* write current valid superblock */
bh = sb_bread(sbi->sb, sbi->valid_super_block);
if (!bh)
return -EIO;
err = __f2fs_commit_super(bh, F2FS_RAW_SUPER(sbi));
brelse(bh);
return err;
}
static int f2fs_scan_devices(struct f2fs_sb_info *sbi)
{
struct f2fs_super_block *raw_super = F2FS_RAW_SUPER(sbi);
unsigned int max_devices = MAX_DEVICES;
int i;
/* Initialize single device information */
if (!RDEV(0).path[0]) {
if (!bdev_is_zoned(sbi->sb->s_bdev))
return 0;
max_devices = 1;
}
/*
* Initialize multiple devices information, or single
* zoned block device information.
*/
sbi->devs = f2fs_kzalloc(sbi,
array_size(max_devices,
sizeof(struct f2fs_dev_info)),
GFP_KERNEL);
if (!sbi->devs)
return -ENOMEM;
for (i = 0; i < max_devices; i++) {
if (i > 0 && !RDEV(i).path[0])
break;
if (max_devices == 1) {
/* Single zoned block device mount */
FDEV(0).bdev =
blkdev_get_by_dev(sbi->sb->s_bdev->bd_dev,
sbi->sb->s_mode, sbi->sb->s_type);
} else {
/* Multi-device mount */
memcpy(FDEV(i).path, RDEV(i).path, MAX_PATH_LEN);
FDEV(i).total_segments =
le32_to_cpu(RDEV(i).total_segments);
if (i == 0) {
FDEV(i).start_blk = 0;
FDEV(i).end_blk = FDEV(i).start_blk +
(FDEV(i).total_segments <<
sbi->log_blocks_per_seg) - 1 +
le32_to_cpu(raw_super->segment0_blkaddr);
} else {
FDEV(i).start_blk = FDEV(i - 1).end_blk + 1;
FDEV(i).end_blk = FDEV(i).start_blk +
(FDEV(i).total_segments <<
sbi->log_blocks_per_seg) - 1;
}
FDEV(i).bdev = blkdev_get_by_path(FDEV(i).path,
sbi->sb->s_mode, sbi->sb->s_type);
}
if (IS_ERR(FDEV(i).bdev))
return PTR_ERR(FDEV(i).bdev);
/* to release errored devices */
sbi->s_ndevs = i + 1;
#ifdef CONFIG_BLK_DEV_ZONED
if (bdev_zoned_model(FDEV(i).bdev) == BLK_ZONED_HM &&
!f2fs_sb_has_blkzoned(sbi)) {
f2fs_err(sbi, "Zoned block device feature not enabled");
return -EINVAL;
}
if (bdev_zoned_model(FDEV(i).bdev) != BLK_ZONED_NONE) {
if (init_blkz_info(sbi, i)) {
f2fs_err(sbi, "Failed to initialize F2FS blkzone information");
return -EINVAL;
}
if (max_devices == 1)
break;
f2fs_info(sbi, "Mount Device [%2d]: %20s, %8u, %8x - %8x (zone: %s)",
i, FDEV(i).path,
FDEV(i).total_segments,
FDEV(i).start_blk, FDEV(i).end_blk,
bdev_zoned_model(FDEV(i).bdev) == BLK_ZONED_HA ?
"Host-aware" : "Host-managed");
continue;
}
#endif
f2fs_info(sbi, "Mount Device [%2d]: %20s, %8u, %8x - %8x",
i, FDEV(i).path,
FDEV(i).total_segments,
FDEV(i).start_blk, FDEV(i).end_blk);
}
f2fs_info(sbi,
"IO Block Size: %8d KB", F2FS_IO_SIZE_KB(sbi));
return 0;
}
static int f2fs_setup_casefold(struct f2fs_sb_info *sbi)
{
#ifdef CONFIG_UNICODE
if (f2fs_sb_has_casefold(sbi) && !sbi->sb->s_encoding) {
const struct f2fs_sb_encodings *encoding_info;
struct unicode_map *encoding;
__u16 encoding_flags;
if (f2fs_sb_read_encoding(sbi->raw_super, &encoding_info,
&encoding_flags)) {
f2fs_err(sbi,
"Encoding requested by superblock is unknown");
return -EINVAL;
}
encoding = utf8_load(encoding_info->version);
if (IS_ERR(encoding)) {
f2fs_err(sbi,
"can't mount with superblock charset: %s-%s "
"not supported by the kernel. flags: 0x%x.",
encoding_info->name, encoding_info->version,
encoding_flags);
return PTR_ERR(encoding);
}
f2fs_info(sbi, "Using encoding defined by superblock: "
"%s-%s with flags 0x%hx", encoding_info->name,
encoding_info->version?:"\b", encoding_flags);
sbi->sb->s_encoding = encoding;
sbi->sb->s_encoding_flags = encoding_flags;
}
#else
if (f2fs_sb_has_casefold(sbi)) {
f2fs_err(sbi, "Filesystem with casefold feature cannot be mounted without CONFIG_UNICODE");
return -EINVAL;
}
#endif
return 0;
}
static void f2fs_tuning_parameters(struct f2fs_sb_info *sbi)
{
struct f2fs_sm_info *sm_i = SM_I(sbi);
/* adjust parameters according to the volume size */
if (sm_i->main_segments <= SMALL_VOLUME_SEGMENTS) {
F2FS_OPTION(sbi).alloc_mode = ALLOC_MODE_REUSE;
sm_i->dcc_info->discard_granularity = 1;
sm_i->ipu_policy = 1 << F2FS_IPU_FORCE |
1 << F2FS_IPU_HONOR_OPU_WRITE;
}
sbi->readdir_ra = 1;
}
static int f2fs_fill_super(struct super_block *sb, void *data, int silent)
{
struct f2fs_sb_info *sbi;
struct f2fs_super_block *raw_super;
struct inode *root;
int err;
bool skip_recovery = false, need_fsck = false;
char *options = NULL;
int recovery, i, valid_super_block;
struct curseg_info *seg_i;
int retry_cnt = 1;
try_onemore:
err = -EINVAL;
raw_super = NULL;
valid_super_block = -1;
recovery = 0;
/* allocate memory for f2fs-specific super block info */
sbi = kzalloc(sizeof(struct f2fs_sb_info), GFP_KERNEL);
if (!sbi)
return -ENOMEM;
sbi->sb = sb;
/* Load the checksum driver */
sbi->s_chksum_driver = crypto_alloc_shash("crc32", 0, 0);
if (IS_ERR(sbi->s_chksum_driver)) {
f2fs_err(sbi, "Cannot load crc32 driver.");
err = PTR_ERR(sbi->s_chksum_driver);
sbi->s_chksum_driver = NULL;
goto free_sbi;
}
/* set a block size */
if (unlikely(!sb_set_blocksize(sb, F2FS_BLKSIZE))) {
f2fs_err(sbi, "unable to set blocksize");
goto free_sbi;
}
err = read_raw_super_block(sbi, &raw_super, &valid_super_block,
&recovery);
if (err)
goto free_sbi;
sb->s_fs_info = sbi;
sbi->raw_super = raw_super;
/* precompute checksum seed for metadata */
if (f2fs_sb_has_inode_chksum(sbi))
sbi->s_chksum_seed = f2fs_chksum(sbi, ~0, raw_super->uuid,
sizeof(raw_super->uuid));
default_options(sbi);
/* parse mount options */
options = kstrdup((const char *)data, GFP_KERNEL);
if (data && !options) {
err = -ENOMEM;
goto free_sb_buf;
}
err = parse_options(sb, options, false);
if (err)
goto free_options;
sb->s_maxbytes = max_file_blocks(NULL) <<
le32_to_cpu(raw_super->log_blocksize);
sb->s_max_links = F2FS_LINK_MAX;
err = f2fs_setup_casefold(sbi);
if (err)
goto free_options;
#ifdef CONFIG_QUOTA
sb->dq_op = &f2fs_quota_operations;
sb->s_qcop = &f2fs_quotactl_ops;
sb->s_quota_types = QTYPE_MASK_USR | QTYPE_MASK_GRP | QTYPE_MASK_PRJ;
if (f2fs_sb_has_quota_ino(sbi)) {
for (i = 0; i < MAXQUOTAS; i++) {
if (f2fs_qf_ino(sbi->sb, i))
sbi->nquota_files++;
}
}
#endif
sb->s_op = &f2fs_sops;
#ifdef CONFIG_FS_ENCRYPTION
sb->s_cop = &f2fs_cryptops;
#endif
#ifdef CONFIG_FS_VERITY
sb->s_vop = &f2fs_verityops;
#endif
sb->s_xattr = f2fs_xattr_handlers;
sb->s_export_op = &f2fs_export_ops;
sb->s_magic = F2FS_SUPER_MAGIC;
sb->s_time_gran = 1;
sb->s_flags = (sb->s_flags & ~SB_POSIXACL) |
(test_opt(sbi, POSIX_ACL) ? SB_POSIXACL : 0);
memcpy(&sb->s_uuid, raw_super->uuid, sizeof(raw_super->uuid));
sb->s_iflags |= SB_I_CGROUPWB;
/* init f2fs-specific super block info */
sbi->valid_super_block = valid_super_block;
init_f2fs_rwsem(&sbi->gc_lock);
mutex_init(&sbi->writepages);
init_f2fs_rwsem(&sbi->cp_global_sem);
init_f2fs_rwsem(&sbi->node_write);
init_f2fs_rwsem(&sbi->node_change);
/* disallow all the data/node/meta page writes */
set_sbi_flag(sbi, SBI_POR_DOING);
spin_lock_init(&sbi->stat_lock);
/* init iostat info */
spin_lock_init(&sbi->iostat_lock);
sbi->iostat_enable = false;
sbi->iostat_period_ms = DEFAULT_IOSTAT_PERIOD_MS;
for (i = 0; i < NR_PAGE_TYPE; i++) {
int n = (i == META) ? 1 : NR_TEMP_TYPE;
int j;
sbi->write_io[i] =
f2fs_kmalloc(sbi,
array_size(n,
sizeof(struct f2fs_bio_info)),
GFP_KERNEL);
if (!sbi->write_io[i]) {
err = -ENOMEM;
goto free_bio_info;
}
for (j = HOT; j < n; j++) {
init_f2fs_rwsem(&sbi->write_io[i][j].io_rwsem);
sbi->write_io[i][j].sbi = sbi;
sbi->write_io[i][j].bio = NULL;
spin_lock_init(&sbi->write_io[i][j].io_lock);
INIT_LIST_HEAD(&sbi->write_io[i][j].io_list);
INIT_LIST_HEAD(&sbi->write_io[i][j].bio_list);
init_f2fs_rwsem(&sbi->write_io[i][j].bio_list_lock);
}
}
init_f2fs_rwsem(&sbi->cp_rwsem);
init_f2fs_rwsem(&sbi->quota_sem);
init_waitqueue_head(&sbi->cp_wait);
init_sb_info(sbi);
err = init_percpu_info(sbi);
if (err)
goto free_bio_info;
if (F2FS_IO_ALIGNED(sbi)) {
sbi->write_io_dummy =
mempool_create_page_pool(2 * (F2FS_IO_SIZE(sbi) - 1), 0);
if (!sbi->write_io_dummy) {
err = -ENOMEM;
goto free_percpu;
}
}
/* init per sbi slab cache */
err = f2fs_init_xattr_caches(sbi);
if (err)
goto free_io_dummy;
err = f2fs_init_page_array_cache(sbi);
if (err)
goto free_xattr_cache;
/* get an inode for meta space */
sbi->meta_inode = f2fs_iget(sb, F2FS_META_INO(sbi));
if (IS_ERR(sbi->meta_inode)) {
f2fs_err(sbi, "Failed to read F2FS meta data inode");
err = PTR_ERR(sbi->meta_inode);
goto free_page_array_cache;
}
err = f2fs_get_valid_checkpoint(sbi);
if (err) {
f2fs_err(sbi, "Failed to get valid F2FS checkpoint");
goto free_meta_inode;
}
if (__is_set_ckpt_flags(F2FS_CKPT(sbi), CP_QUOTA_NEED_FSCK_FLAG))
set_sbi_flag(sbi, SBI_QUOTA_NEED_REPAIR);
if (__is_set_ckpt_flags(F2FS_CKPT(sbi), CP_DISABLED_QUICK_FLAG)) {
set_sbi_flag(sbi, SBI_CP_DISABLED_QUICK);
sbi->interval_time[DISABLE_TIME] = DEF_DISABLE_QUICK_INTERVAL;
}
if (__is_set_ckpt_flags(F2FS_CKPT(sbi), CP_FSCK_FLAG))
set_sbi_flag(sbi, SBI_NEED_FSCK);
/* Initialize device list */
err = f2fs_scan_devices(sbi);
if (err) {
f2fs_err(sbi, "Failed to find devices");
goto free_devices;
}
err = f2fs_init_post_read_wq(sbi);
if (err) {
f2fs_err(sbi, "Failed to initialize post read workqueue");
goto free_devices;
}
sbi->total_valid_node_count =
le32_to_cpu(sbi->ckpt->valid_node_count);
percpu_counter_set(&sbi->total_valid_inode_count,
le32_to_cpu(sbi->ckpt->valid_inode_count));
sbi->user_block_count = le64_to_cpu(sbi->ckpt->user_block_count);
sbi->total_valid_block_count =
le64_to_cpu(sbi->ckpt->valid_block_count);
sbi->last_valid_block_count = sbi->total_valid_block_count;
sbi->reserved_blocks = 0;
sbi->current_reserved_blocks = 0;
limit_reserve_root(sbi);
adjust_unusable_cap_perc(sbi);
for (i = 0; i < NR_INODE_TYPE; i++) {
INIT_LIST_HEAD(&sbi->inode_list[i]);
spin_lock_init(&sbi->inode_lock[i]);
}
mutex_init(&sbi->flush_lock);
f2fs_init_extent_cache_info(sbi);
f2fs_init_ino_entry_info(sbi);
f2fs_init_fsync_node_info(sbi);
/* setup checkpoint request control and start checkpoint issue thread */
f2fs_init_ckpt_req_control(sbi);
if (!f2fs_readonly(sb) && !test_opt(sbi, DISABLE_CHECKPOINT) &&
test_opt(sbi, MERGE_CHECKPOINT)) {
err = f2fs_start_ckpt_thread(sbi);
if (err) {
f2fs_err(sbi,
"Failed to start F2FS issue_checkpoint_thread (%d)",
err);
goto stop_ckpt_thread;
}
}
/* setup f2fs internal modules */
err = f2fs_build_segment_manager(sbi);
if (err) {
f2fs_err(sbi, "Failed to initialize F2FS segment manager (%d)",
err);
goto free_sm;
}
err = f2fs_build_node_manager(sbi);
if (err) {
f2fs_err(sbi, "Failed to initialize F2FS node manager (%d)",
err);
goto free_nm;
}
err = adjust_reserved_segment(sbi);
if (err)
goto free_nm;
/* For write statistics */
sbi->sectors_written_start = f2fs_get_sectors_written(sbi);
/* Read accumulated write IO statistics if exists */
seg_i = CURSEG_I(sbi, CURSEG_HOT_NODE);
if (__exist_node_summaries(sbi))
sbi->kbytes_written =
le64_to_cpu(seg_i->journal->info.kbytes_written);
f2fs_build_gc_manager(sbi);
err = f2fs_build_stats(sbi);
if (err)
goto free_nm;
/* get an inode for node space */
sbi->node_inode = f2fs_iget(sb, F2FS_NODE_INO(sbi));
if (IS_ERR(sbi->node_inode)) {
f2fs_err(sbi, "Failed to read node inode");
err = PTR_ERR(sbi->node_inode);
goto free_stats;
}
/* read root inode and dentry */
root = f2fs_iget(sb, F2FS_ROOT_INO(sbi));
if (IS_ERR(root)) {
f2fs_err(sbi, "Failed to read root inode");
err = PTR_ERR(root);
goto free_node_inode;
}
if (!S_ISDIR(root->i_mode) || !root->i_blocks ||
!root->i_size || !root->i_nlink) {
iput(root);
err = -EINVAL;
goto free_node_inode;
}
sb->s_root = d_make_root(root); /* allocate root dentry */
if (!sb->s_root) {
err = -ENOMEM;
goto free_node_inode;
}
err = f2fs_init_compress_inode(sbi);
if (err)
goto free_root_inode;
err = f2fs_register_sysfs(sbi);
if (err)
goto free_compress_inode;
#ifdef CONFIG_QUOTA
/* Enable quota usage during mount */
if (f2fs_sb_has_quota_ino(sbi) && !f2fs_readonly(sb)) {
err = f2fs_enable_quotas(sb);
if (err)
f2fs_err(sbi, "Cannot turn on quotas: error %d", err);
}
#endif
/* if there are any orphan inodes, free them */
err = f2fs_recover_orphan_inodes(sbi);
if (err)
goto free_meta;
if (unlikely(is_set_ckpt_flags(sbi, CP_DISABLED_FLAG)))
goto reset_checkpoint;
/* recover fsynced data */
if (!test_opt(sbi, DISABLE_ROLL_FORWARD) &&
!test_opt(sbi, NORECOVERY)) {
/*
* mount should be failed, when device has readonly mode, and
* previous checkpoint was not done by clean system shutdown.
*/
if (f2fs_hw_is_readonly(sbi)) {
if (!is_set_ckpt_flags(sbi, CP_UMOUNT_FLAG)) {
err = f2fs_recover_fsync_data(sbi, true);
if (err > 0) {
err = -EROFS;
f2fs_err(sbi, "Need to recover fsync data, but "
"write access unavailable, please try "
"mount w/ disable_roll_forward or norecovery");
}
if (err < 0)
goto free_meta;
}
f2fs_info(sbi, "write access unavailable, skipping recovery");
goto reset_checkpoint;
}
if (need_fsck)
set_sbi_flag(sbi, SBI_NEED_FSCK);
if (skip_recovery)
goto reset_checkpoint;
err = f2fs_recover_fsync_data(sbi, false);
if (err < 0) {
if (err != -ENOMEM)
skip_recovery = true;
need_fsck = true;
f2fs_err(sbi, "Cannot recover all fsync data errno=%d",
err);
goto free_meta;
}
} else {
err = f2fs_recover_fsync_data(sbi, true);
if (!f2fs_readonly(sb) && err > 0) {
err = -EINVAL;
f2fs_err(sbi, "Need to recover fsync data");
goto free_meta;
}
}
/*
* If the f2fs is not readonly and fsync data recovery succeeds,
* check zoned block devices' write pointer consistency.
*/
if (!err && !f2fs_readonly(sb) && f2fs_sb_has_blkzoned(sbi)) {
err = f2fs_check_write_pointer(sbi);
if (err)
goto free_meta;
}
reset_checkpoint:
f2fs_init_inmem_curseg(sbi);
/* f2fs_recover_fsync_data() cleared this already */
clear_sbi_flag(sbi, SBI_POR_DOING);
if (test_opt(sbi, DISABLE_CHECKPOINT)) {
err = f2fs_disable_checkpoint(sbi);
if (err)
goto sync_free_meta;
} else if (is_set_ckpt_flags(sbi, CP_DISABLED_FLAG)) {
f2fs_enable_checkpoint(sbi);
}
/*
* If filesystem is not mounted as read-only then
* do start the gc_thread.
*/
if ((F2FS_OPTION(sbi).bggc_mode != BGGC_MODE_OFF ||
test_opt(sbi, GC_MERGE)) && !f2fs_readonly(sb)) {
/* After POR, we can run background GC thread.*/
err = f2fs_start_gc_thread(sbi);
if (err)
goto sync_free_meta;
}
kvfree(options);
/* recover broken superblock */
if (recovery) {
err = f2fs_commit_super(sbi, true);
f2fs_info(sbi, "Try to recover %dth superblock, ret: %d",
sbi->valid_super_block ? 1 : 2, err);
}
f2fs_join_shrinker(sbi);
f2fs_tuning_parameters(sbi);
f2fs_notice(sbi, "Mounted with checkpoint version = %llx",
cur_cp_version(F2FS_CKPT(sbi)));
f2fs_update_time(sbi, CP_TIME);
f2fs_update_time(sbi, REQ_TIME);
clear_sbi_flag(sbi, SBI_CP_DISABLED_QUICK);
return 0;
sync_free_meta:
/* safe to flush all the data */
sync_filesystem(sbi->sb);
retry_cnt = 0;
free_meta:
#ifdef CONFIG_QUOTA
f2fs_truncate_quota_inode_pages(sb);
if (f2fs_sb_has_quota_ino(sbi) && !f2fs_readonly(sb))
f2fs_quota_off_umount(sbi->sb);
#endif
/*
* Some dirty meta pages can be produced by f2fs_recover_orphan_inodes()
* failed by EIO. Then, iput(node_inode) can trigger balance_fs_bg()
* followed by f2fs_write_checkpoint() through f2fs_write_node_pages(), which
* falls into an infinite loop in f2fs_sync_meta_pages().
*/
truncate_inode_pages_final(META_MAPPING(sbi));
/* evict some inodes being cached by GC */
evict_inodes(sb);
f2fs_unregister_sysfs(sbi);
free_compress_inode:
f2fs_destroy_compress_inode(sbi);
free_root_inode:
dput(sb->s_root);
sb->s_root = NULL;
free_node_inode:
f2fs_release_ino_entry(sbi, true);
truncate_inode_pages_final(NODE_MAPPING(sbi));
iput(sbi->node_inode);
sbi->node_inode = NULL;
free_stats:
f2fs_destroy_stats(sbi);
free_nm:
/* stop discard thread before destroying node manager */
f2fs_stop_discard_thread(sbi);
f2fs_destroy_node_manager(sbi);
free_sm:
f2fs_destroy_segment_manager(sbi);
f2fs_destroy_post_read_wq(sbi);
stop_ckpt_thread:
f2fs_stop_ckpt_thread(sbi);
free_devices:
destroy_device_list(sbi);
kvfree(sbi->ckpt);
free_meta_inode:
make_bad_inode(sbi->meta_inode);
iput(sbi->meta_inode);
sbi->meta_inode = NULL;
free_page_array_cache:
f2fs_destroy_page_array_cache(sbi);
free_xattr_cache:
f2fs_destroy_xattr_caches(sbi);
free_io_dummy:
mempool_destroy(sbi->write_io_dummy);
free_percpu:
destroy_percpu_info(sbi);
free_bio_info:
for (i = 0; i < NR_PAGE_TYPE; i++)
kvfree(sbi->write_io[i]);
#ifdef CONFIG_UNICODE
utf8_unload(sb->s_encoding);
sb->s_encoding = NULL;
#endif
free_options:
#ifdef CONFIG_QUOTA
for (i = 0; i < MAXQUOTAS; i++)
kfree(F2FS_OPTION(sbi).s_qf_names[i]);
#endif
fscrypt_free_dummy_policy(&F2FS_OPTION(sbi).dummy_enc_policy);
kvfree(options);
free_sb_buf:
kfree(raw_super);
free_sbi:
if (sbi->s_chksum_driver)
crypto_free_shash(sbi->s_chksum_driver);
kfree(sbi);
/* give only one another chance */
if (retry_cnt > 0 && skip_recovery) {
retry_cnt--;
shrink_dcache_sb(sb);
goto try_onemore;
}
return err;
}
static struct dentry *f2fs_mount(struct file_system_type *fs_type, int flags,
const char *dev_name, void *data)
{
return mount_bdev(fs_type, flags, dev_name, data, f2fs_fill_super);
}
static void kill_f2fs_super(struct super_block *sb)
{
if (sb->s_root) {
struct f2fs_sb_info *sbi = F2FS_SB(sb);
set_sbi_flag(sbi, SBI_IS_CLOSE);
f2fs_stop_gc_thread(sbi);
f2fs_stop_discard_thread(sbi);
#ifdef CONFIG_F2FS_FS_COMPRESSION
/*
* latter evict_inode() can bypass checking and invalidating
* compress inode cache.
*/
if (test_opt(sbi, COMPRESS_CACHE))
truncate_inode_pages_final(COMPRESS_MAPPING(sbi));
#endif
if (is_sbi_flag_set(sbi, SBI_IS_DIRTY) ||
!is_set_ckpt_flags(sbi, CP_UMOUNT_FLAG)) {
struct cp_control cpc = {
.reason = CP_UMOUNT,
};
f2fs_write_checkpoint(sbi, &cpc);
}
if (is_sbi_flag_set(sbi, SBI_IS_RECOVERED) && f2fs_readonly(sb))
sb->s_flags &= ~SB_RDONLY;
}
kill_block_super(sb);
}
static struct file_system_type f2fs_fs_type = {
.owner = THIS_MODULE,
.name = "f2fs",
.mount = f2fs_mount,
.kill_sb = kill_f2fs_super,
.fs_flags = FS_REQUIRES_DEV,
};
MODULE_ALIAS_FS("f2fs");
static int __init init_inodecache(void)
{
f2fs_inode_cachep = kmem_cache_create("f2fs_inode_cache",
sizeof(struct f2fs_inode_info), 0,
SLAB_RECLAIM_ACCOUNT|SLAB_ACCOUNT, NULL);
if (!f2fs_inode_cachep)
return -ENOMEM;
return 0;
}
static void destroy_inodecache(void)
{
/*
* Make sure all delayed rcu free inodes are flushed before we
* destroy cache.
*/
rcu_barrier();
kmem_cache_destroy(f2fs_inode_cachep);
}
static int __init init_f2fs_fs(void)
{
int err;
if (PAGE_SIZE != F2FS_BLKSIZE) {
printk("F2FS not supported on PAGE_SIZE(%lu) != %d\n",
PAGE_SIZE, F2FS_BLKSIZE);
return -EINVAL;
}
err = init_inodecache();
if (err)
goto fail;
err = f2fs_create_node_manager_caches();
if (err)
goto free_inodecache;
err = f2fs_create_segment_manager_caches();
if (err)
goto free_node_manager_caches;
err = f2fs_create_checkpoint_caches();
if (err)
goto free_segment_manager_caches;
err = f2fs_create_recovery_cache();
if (err)
goto free_checkpoint_caches;
err = f2fs_create_extent_cache();
if (err)
goto free_recovery_cache;
err = f2fs_create_garbage_collection_cache();
if (err)
goto free_extent_cache;
err = f2fs_init_sysfs();
if (err)
goto free_garbage_collection_cache;
err = register_shrinker(&f2fs_shrinker_info);
if (err)
goto free_sysfs;
err = register_filesystem(&f2fs_fs_type);
if (err)
goto free_shrinker;
f2fs_create_root_stats();
err = f2fs_init_post_read_processing();
if (err)
goto free_root_stats;
err = f2fs_init_bio_entry_cache();
if (err)
goto free_post_read;
err = f2fs_init_bioset();
if (err)
goto free_bio_enrty_cache;
err = f2fs_init_compress_mempool();
if (err)
goto free_bioset;
err = f2fs_init_compress_cache();
if (err)
goto free_compress_mempool;
err = f2fs_create_casefold_cache();
if (err)
goto free_compress_cache;
return 0;
free_compress_cache:
f2fs_destroy_compress_cache();
free_compress_mempool:
f2fs_destroy_compress_mempool();
free_bioset:
f2fs_destroy_bioset();
free_bio_enrty_cache:
f2fs_destroy_bio_entry_cache();
free_post_read:
f2fs_destroy_post_read_processing();
free_root_stats:
f2fs_destroy_root_stats();
unregister_filesystem(&f2fs_fs_type);
free_shrinker:
unregister_shrinker(&f2fs_shrinker_info);
free_sysfs:
f2fs_exit_sysfs();
free_garbage_collection_cache:
f2fs_destroy_garbage_collection_cache();
free_extent_cache:
f2fs_destroy_extent_cache();
free_recovery_cache:
f2fs_destroy_recovery_cache();
free_checkpoint_caches:
f2fs_destroy_checkpoint_caches();
free_segment_manager_caches:
f2fs_destroy_segment_manager_caches();
free_node_manager_caches:
f2fs_destroy_node_manager_caches();
free_inodecache:
destroy_inodecache();
fail:
return err;
}
static void __exit exit_f2fs_fs(void)
{
f2fs_destroy_casefold_cache();
f2fs_destroy_compress_cache();
f2fs_destroy_compress_mempool();
f2fs_destroy_bioset();
f2fs_destroy_bio_entry_cache();
f2fs_destroy_post_read_processing();
f2fs_destroy_root_stats();
unregister_filesystem(&f2fs_fs_type);
unregister_shrinker(&f2fs_shrinker_info);
f2fs_exit_sysfs();
f2fs_destroy_garbage_collection_cache();
f2fs_destroy_extent_cache();
f2fs_destroy_recovery_cache();
f2fs_destroy_checkpoint_caches();
f2fs_destroy_segment_manager_caches();
f2fs_destroy_node_manager_caches();
destroy_inodecache();
}
module_init(init_f2fs_fs)
module_exit(exit_f2fs_fs)
MODULE_AUTHOR("Samsung Electronics's Praesto Team");
MODULE_DESCRIPTION("Flash Friendly File System");
MODULE_LICENSE("GPL");
MODULE_IMPORT_NS(ANDROID_GKI_VFS_EXPORT_ONLY);
MODULE_SOFTDEP("pre: crc32");