mirror of
https://github.com/rd-stuffs/msm-4.14.git
synced 2025-02-20 11:45:48 +08:00
* refs/heads/tmp-1391d3b: Linux 4.14.135 access: avoid the RCU grace period for the temporary subjective credentials powerpc/tm: Fix oops on sigreturn on systems without TM powerpc/xive: Fix loop exit-condition in xive_find_target_in_mask() ALSA: hda - Add a conexant codec entry to let mute led work ALSA: line6: Fix wrong altsetting for LINE6_PODHD500_1 hpet: Fix division by zero in hpet_time_div() fpga-manager: altera-ps-spi: Fix build error binder: prevent transactions to context manager from its own process. x86/speculation/mds: Apply more accurate check on hypervisor platform x86/sysfb_efi: Add quirks for some devices with swapped width and height btrfs: inode: Don't compress if NODATASUM or NODATACOW set KVM: nVMX: do not use dangling shadow VMCS after guest reset usb: pci-quirks: Correct AMD PLL quirk detection usb: wusbcore: fix unbalanced get/put cluster_id drm/crc-debugfs: Also sprinkle irqrestore over early exits drm/crc: Only report a single overflow when a CRC fd is opened locking/lockdep: Hide unused 'class' variable locking/lockdep: Fix lock used or unused stats error mm/mmu_notifier: use hlist_add_head_rcu() mm/gup.c: remove some BUG_ONs from get_gate_page() mm/gup.c: mark undo_dev_pagemap as __maybe_unused 9p: pass the correct prototype to read_cache_page mm/kmemleak.c: fix check for softirq context sh: prevent warnings when using iounmap block/bio-integrity: fix a memory leak bug powerpc/eeh: Handle hugepages in ioremap space mailbox: handle failed named mailbox channel request f2fs: avoid out-of-range memory access powerpc/boot: add {get, put}_unaligned_be32 to xz_config.h PCI: dwc: pci-dra7xx: Fix compilation when !CONFIG_GPIOLIB RDMA/rxe: Fill in wc byte_len with IB_WC_RECV_RDMA_WITH_IMM perf annotate: Fix dereferencing freed memory found by the smatch tool perf session: Fix potential NULL pointer dereference found by the smatch tool perf test mmap-thread-lookup: Initialize variable to suppress memory sanitizer warning kallsyms: exclude kasan local symbols on s390 serial: sh-sci: Fix TX DMA buffer flushing and workqueue races serial: sh-sci: Terminate TX DMA during buffer flushing RDMA/i40iw: Set queue pair state when being queried powerpc/4xx/uic: clear pending interrupt after irq type/pol change um: Silence lockdep complaint about mmap_sem mfd: hi655x-pmic: Fix missing return value check for devm_regmap_init_mmio_clk mfd: arizona: Fix undefined behavior mfd: core: Set fwnode for created devices recordmcount: Fix spurious mcount entries on powerpc powerpc/xmon: Fix disabling tracing while in xmon iio: iio-utils: Fix possible incorrect mask calculation PCI: xilinx-nwl: Fix Multi MSI data programming kbuild: Add -Werror=unknown-warning-option to CLANG_FLAGS PCI: sysfs: Ignore lockdep for remove attribute serial: mctrl_gpio: Check if GPIO property exisits before requesting it drm/msm: Depopulate platform on probe failure powerpc/pci/of: Fix OF flags parsing for 64bit BARs usb: gadget: Zero ffs_io_data tty: serial_core: Set port active bit in uart_port_activate drm/rockchip: Properly adjust to a true clock in adjusted_mode powerpc/pseries/mobility: prevent cpu hotplug during DT update phy: renesas: rcar-gen2: Fix memory leak at error paths drm/virtio: Add memory barriers for capset cache. serial: 8250: Fix TX interrupt handling condition tty: serial: msm_serial: avoid system lockup condition tty/serial: digicolor: Fix digicolor-usart already registered warning memstick: Fix error cleanup path of memstick_init drm/crc-debugfs: User irqsafe spinlock in drm_crtc_add_crc_entry drm/bridge: sii902x: pixel clock unit is 10kHz instead of 1kHz drm/bridge: tc358767: read display_props in get_modes() PCI: Return error if cannot probe VF drm/edid: Fix a missing-check bug in drm_load_edid_firmware() tty: serial: cpm_uart - fix init when SMC is relocated pinctrl: rockchip: fix leaked of_node references tty: max310x: Fix invalid baudrate divisors calculator usb: core: hub: Disable hub-initiated U1/U2 drm/panel: simple: Fix panel_simple_dsi_probe hvsock: fix epollout hang from race condition nfsd: Fix overflow causing non-working mounts on 1 TB machines nfsd: fix performance-limiting session calculation nfsd: give out fewer session slots as limit approaches nfsd: increase DRC cache limit NFSv4: Fix open create exclusive when the server reboots perf/events/amd/uncore: Fix amd_uncore_llc ID to use pre-defined cpu_llc_id mm: vmscan: scan anonymous pages on file refaults ext4: allow directory holes ext4: use jbd2_inode dirty range scoping jbd2: introduce jbd2_inode dirty range scoping mm: add filemap_fdatawait_range_keep_errors() ext4: enforce the immutable flag on open files ext4: don't allow any modifications to an immutable file MIPS: lb60: Fix pin mappings dma-buf: Discard old fence_excl on retrying get_fences_rcu for realloc dma-buf: balance refcount inbalance net: bridge: stp: don't cache eth dest pointer before skb pull net: bridge: mcast: fix stale ipv6 hdr pointer when handling v6 query net: bridge: mcast: fix stale nsrcs pointer in igmp3/mld2 report handling tcp: Reset bytes_acked and bytes_received when disconnecting tcp: fix tcp_set_congestion_control() use from bpf hook net: make skb_dst_force return true when dst is refcounted bonding: validate ip header before check IPPROTO_IGMP netrom: hold sock when setting skb->destructor netrom: fix a memory leak in nr_rx_frame() macsec: fix checksumming after decryption macsec: fix use-after-free of skb during RX vrf: make sure skb->data contains ip header to make routing sky2: Disable MSI on ASUS P6T rxrpc: Fix send on a connected, but unbound socket nfc: fix potential illegal memory access net: openvswitch: fix csum updates for MPLS actions net: neigh: fix multiple neigh timer scheduling net: dsa: mv88e6xxx: wait after reset deactivation net: bcmgenet: use promisc for unsupported filters ipv4: don't set IPv6 only flags to IPv4 addresses igmp: fix memory leak in igmpv3_del_delrec() caif-hsi: fix possible deadlock in cfhsi_exit_module() bnx2x: Prevent ptp_task to be rescheduled indefinitely bnx2x: Prevent load reordering in tx completion processing lib/strscpy: Shut up KASAN false-positives in strscpy() compiler.h: Add read_word_at_a_time() function. compiler.h, kasan: Avoid duplicating __read_once_size_nocheck() dm bufio: fix deadlock with loop device dt-bindings: allow up to four clocks for orion-mdio net: mvmdio: allow up to four clocks to be specified for orion-mdio usb: Handle USB3 remote wakeup for LPM enabled devices correctly Bluetooth: Add SMP workaround Microsoft Surface Precision Mouse bug intel_th: msu: Fix single mode with disabled IOMMU eCryptfs: fix a couple type promotion bugs powerpc/watchpoint: Restore NV GPRs while returning from exception powerpc/32s: fix suspend/resume when IBATs 4-7 are used parisc: Fix kernel panic due invalid values in IAOQ0 or IAOQ1 parisc: Ensure userspace privilege for ptraced processes in regset functions crypto: caam - limit output IV to CBC to work around CTR mode DMA issue PCI: hv: Fix a use-after-free bug in hv_eject_device_work() gpu: ipu-v3: ipu-ic: Fix saturation bit offset in TPMEM coda: pass the host file in vma->vm_file on mmap libnvdimm/pfn: fix fsdax-mode namespace info-block zero-fields HID: wacom: correct touch resolution x/y typo HID: wacom: generic: only switch the mode on devices with LEDs Btrfs: add missing inode version, ctime and mtime updates when punching hole Btrfs: fix fsync not persisting dentry deletions due to inode evictions Btrfs: fix data loss after inode eviction, renaming it, and fsync it PCI: Do not poll for PME if the device is in D3cold intel_th: pci: Add Ice Lake NNPI support perf/x86/amd/uncore: Set the thread mask for F17h L3 PMCs perf/x86/amd/uncore: Do not set 'ThreadMask' and 'SliceMask' for non-L3 PMCs x86/boot: Fix memory leak in default_get_smp_config() 9p/virtio: Add cleanup path in p9_virtio_init 9p/xen: Add cleanup path in p9_trans_xen_init xen/events: fix binding user event channels to cpus dm zoned: fix zone state management race padata: use smp_mb in padata_reorder to avoid orphaned padata jobs drm/nouveau/i2c: Enable i2c pads & busses during preinit fs/proc/proc_sysctl.c: fix the default values of i_uid/i_gid on /proc/sys inodes. arm64: tegra: Fix AGIC register range KVM: x86/vPMU: refine kvm_pmu err msg when event creation failed media: coda: Remove unbalanced and unneeded mutex unlock media: v4l2: Test type instead of cfg->type in v4l2_ctrl_new_custom() ALSA: hda/realtek: apply ALC891 headset fixup to one Dell machine ALSA: seq: Break too long mutex context in the write loop ASoC: dapm: Adapt for debugfs API change lib/scatterlist: Fix mapping iterator when sg->offset is greater than PAGE_SIZE pnfs/flexfiles: Fix PTR_ERR() dereferences in ff_layout_track_ds_error NFSv4: Handle the special Linux file open access mode iwlwifi: pcie: fix ALIVE interrupt handling for gen2 devices w/o MSI-X iwlwifi: pcie: don't service an interrupt that was masked arm64: tegra: Update Jetson TX1 GPU regulator timings regulator: s2mps11: Fix buck7 and buck8 wrong voltages Input: alps - fix a mismatch between a condition check and its comment Input: synaptics - whitelist Lenovo T580 SMBus intertouch Input: alps - don't handle ALPS cs19 trackpoint-only device Input: gtco - bounds check collection indent level crypto: crypto4xx - fix a potential double free in ppc4xx_trng_probe crypto: ccp/gcm - use const time tag comparison. crypto: ccp - memset structure fields to zero before reuse crypto: chacha20poly1305 - fix atomic sleep when using async algorithm crypto: arm64/sha2-ce - correct digest for empty data in finup crypto: arm64/sha1-ce - correct digest for empty data in finup crypto: ccp - Validate the the error value used to index error messages crypto: ghash - fix unaligned memory access in ghash_setkey() scsi: mac_scsi: Fix pseudo DMA implementation, take 2 scsi: mac_scsi: Increase PIO/PDMA transfer length threshold scsi: megaraid_sas: Fix calculation of target ID scsi: core: Fix race on creating sense cache Revert "scsi: ncr5380: Increase register polling limit" scsi: NCR5380: Always re-enable reselection interrupt scsi: NCR5380: Reduce goto statements in NCR5380_select() xen: let alloc_xenballooned_pages() fail if not enough memory free floppy: fix out-of-bounds read in copy_buffer floppy: fix invalid pointer dereference in drive_name floppy: fix out-of-bounds read in next_valid_format floppy: fix div-by-zero in setup_format_params iavf: fix dereference of null rx_buffer pointer net: mvmdio: defer probe of orion-mdio if a clock is not ready gtp: fix use-after-free in gtp_newlink() gtp: fix use-after-free in gtp_encap_destroy() gtp: fix Illegal context switch in RCU read-side critical section. gtp: fix suspicious RCU usage Bluetooth: validate BLE connection interval updates gtp: add missing gtp_encap_disable_sock() in gtp_encap_enable() Bluetooth: Check state in l2cap_disconnect_rsp Bluetooth: 6lowpan: search for destination address in all peers Bluetooth: hci_bcsp: Fix memory leak in rx_skb gpiolib: Fix references to gpiod_[gs]et_*value_cansleep() variants net: usb: asix: init MAC address buffers perf stat: Make metric event lookup more robust iwlwifi: mvm: Drop large non sta frames ath10k: destroy sdio workqueue while remove sdio module net: hns3: add some error checking in hclge_tm module net: hns3: fix a -Wformat-nonliteral compile warning bcache: check c->gc_thread by IS_ERR_OR_NULL in cache_set_flush() EDAC: Fix global-out-of-bounds write when setting edac_mc_poll_msec crypto: asymmetric_keys - select CRYPTO_HASH where needed crypto: serpent - mark __serpent_setkey_sbox noinline ixgbe: Check DDM existence in transceiver before access rslib: Fix handling of of caller provided syndrome rslib: Fix decoding of shortened codes clocksource/drivers/exynos_mct: Increase priority over ARM arch timer libata: don't request sense data on !ZAC ATA devices perf tools: Increase MAX_NR_CPUS and MAX_CACHES ath10k: fix PCIE device wake up failed ath10k: add missing error handling ipvs: fix tinfo memory leak in start_sync_thread mt7601u: fix possible memory leak when the device is disconnected x86/build: Add 'set -e' to mkcapflags.sh to delete broken capflags.c mt7601u: do not schedule rx_tasklet when the device has been disconnected rtlwifi: rtl8192cu: fix error handle when usb probe failed media: hdpvr: fix locking and a missing msleep media: vimc: cap: check v4l2_fill_pixfmt return value media: coda: increment sequence offset for the last returned frame media: coda: fix last buffer handling in V4L2_ENC_CMD_STOP media: coda: fix mpeg2 sequence number handling acpi/arm64: ignore 5.1 FADTs that are reported as 5.0 timer_list: Guard procfs specific code ntp: Limit TAI-UTC offset media: i2c: fix warning same module names media: s5p-mfc: Make additional clocks optional ipvs: defer hook registration to avoid leaks ipsec: select crypto ciphers for xfrm_algo EDAC/sysfs: Fix memory leak when creating a csrow object ipoib: correcly show a VF hardware address vhost_net: disable zerocopy by default perf evsel: Make perf_evsel__name() accept a NULL argument x86/atomic: Fix smp_mb__{before,after}_atomic() sched/core: Add __sched tag for io_schedule() xfrm: fix sa selector validation blkcg, writeback: dead memcgs shouldn't contribute to writeback ownership arbitration x86/cpufeatures: Add FDP_EXCPTN_ONLY and ZERO_FCS_FDS rcu: Force inlining of rcu_read_lock() bpf: silence warning messages in core regmap: fix bulk writes on paged registers gpio: omap: ensure irq is enabled before wakeup gpio: omap: fix lack of irqstatus_raw0 for OMAP4 iommu: Fix a leak in iommu_insert_resv_region media: fdp1: Support M3N and E3 platforms perf test 6: Fix missing kvm module load for s390 perf cs-etm: Properly set the value of 'old' and 'head' in snapshot mode ipset: Fix memory accounting for hash types on resize net: sfp: add mutex to prevent concurrent state checks RAS/CEC: Fix pfn insertion s390/qdio: handle PENDING state for QEBSM devices net: axienet: Fix race condition causing TX hang net: fec: Do not use netdev messages too early net: stmmac: dwmac4: fix flow control issue cpupower : frequency-set -r option misses the last cpu in related cpu list media: wl128x: Fix some error handling in fm_v4l2_init_video_device() locking/lockdep: Fix merging of hlocks with non-zero references tua6100: Avoid build warnings. crypto: talitos - Align SEC1 accesses to 32 bits boundaries. crypto: talitos - properly handle split ICV. net: phy: Check against net_device being NULL media: staging: media: davinci_vpfe: - Fix for memory leak if decoder initialization fails. media: mc-device.c: don't memset __user pointer contents fscrypt: clean up some BUG_ON()s in block encryption/decryption xfrm: Fix xfrm sel prefix length validation af_key: fix leaks in key_pol_get_resp and dump_sp. signal/pid_namespace: Fix reboot_pid_ns to use send_sig not force_sig qed: Set the doorbell address correctly net: stmmac: dwmac4/5: Clear unused address entries net: stmmac: dwmac1000: Clear unused address entries media: media_device_enum_links32: clean a reserved field media: vpss: fix a potential NULL pointer dereference media: marvell-ccic: fix DMA s/g desc number calculation crypto: talitos - fix skcipher failure due to wrong output IV media: spi: IR LED: add missing of table registration media: dvb: usb: fix use after free in dvb_usb_device_exit batman-adv: fix for leaked TVLV handler. ath: DFS JP domain W56 fixed pulse type 3 RADAR detection ath6kl: add some bounds checking ath9k: Check for errors when reading SREV register ath10k: Do not send probe response template for mesh wil6210: fix potential out-of-bounds read dmaengine: imx-sdma: fix use-after-free on probe error path scsi: iscsi: set auth_protocol back to NULL if CHAP_A value is not supported arm64/efi: Mark __efistub_stext_offset as an absolute symbol explicitly MIPS: fix build on non-linux hosts MIPS: ath79: fix ar933x uart parity mode ANDROID: enable CONFIG_RTC_DRV_TEST on cuttlefish ANDROID: cuttlefish_defconfig: enable CONFIG_CPU_FREQ_TIMES ANDROID: xfrm: remove in_compat_syscall() checks UPSTREAM: binder: Set end of SG buffer area properly. Conflicts: drivers/gpu/drm/msm/msm_drv.c Change-Id: I3f568e1d41c853c51a6ed293de6420fb447fe8e0 Signed-off-by: Blagovest Kolenichev <bkolenichev@codeaurora.org>
466 lines
16 KiB
C
466 lines
16 KiB
C
/*
|
|
* ext4_jbd2.h
|
|
*
|
|
* Written by Stephen C. Tweedie <sct@redhat.com>, 1999
|
|
*
|
|
* Copyright 1998--1999 Red Hat corp --- All Rights Reserved
|
|
*
|
|
* This file is part of the Linux kernel and is made available under
|
|
* the terms of the GNU General Public License, version 2, or at your
|
|
* option, any later version, incorporated herein by reference.
|
|
*
|
|
* Ext4-specific journaling extensions.
|
|
*/
|
|
|
|
#ifndef _EXT4_JBD2_H
|
|
#define _EXT4_JBD2_H
|
|
|
|
#include <linux/fs.h>
|
|
#include <linux/jbd2.h>
|
|
#include "ext4.h"
|
|
|
|
#define EXT4_JOURNAL(inode) (EXT4_SB((inode)->i_sb)->s_journal)
|
|
|
|
/* Define the number of blocks we need to account to a transaction to
|
|
* modify one block of data.
|
|
*
|
|
* We may have to touch one inode, one bitmap buffer, up to three
|
|
* indirection blocks, the group and superblock summaries, and the data
|
|
* block to complete the transaction.
|
|
*
|
|
* For extents-enabled fs we may have to allocate and modify up to
|
|
* 5 levels of tree, data block (for each of these we need bitmap + group
|
|
* summaries), root which is stored in the inode, sb
|
|
*/
|
|
|
|
#define EXT4_SINGLEDATA_TRANS_BLOCKS(sb) \
|
|
(ext4_has_feature_extents(sb) ? 20U : 8U)
|
|
|
|
/* Extended attribute operations touch at most two data buffers,
|
|
* two bitmap buffers, and two group summaries, in addition to the inode
|
|
* and the superblock, which are already accounted for. */
|
|
|
|
#define EXT4_XATTR_TRANS_BLOCKS 6U
|
|
|
|
/* Define the minimum size for a transaction which modifies data. This
|
|
* needs to take into account the fact that we may end up modifying two
|
|
* quota files too (one for the group, one for the user quota). The
|
|
* superblock only gets updated once, of course, so don't bother
|
|
* counting that again for the quota updates. */
|
|
|
|
#define EXT4_DATA_TRANS_BLOCKS(sb) (EXT4_SINGLEDATA_TRANS_BLOCKS(sb) + \
|
|
EXT4_XATTR_TRANS_BLOCKS - 2 + \
|
|
EXT4_MAXQUOTAS_TRANS_BLOCKS(sb))
|
|
|
|
/*
|
|
* Define the number of metadata blocks we need to account to modify data.
|
|
*
|
|
* This include super block, inode block, quota blocks and xattr blocks
|
|
*/
|
|
#define EXT4_META_TRANS_BLOCKS(sb) (EXT4_XATTR_TRANS_BLOCKS + \
|
|
EXT4_MAXQUOTAS_TRANS_BLOCKS(sb))
|
|
|
|
/* Define an arbitrary limit for the amount of data we will anticipate
|
|
* writing to any given transaction. For unbounded transactions such as
|
|
* write(2) and truncate(2) we can write more than this, but we always
|
|
* start off at the maximum transaction size and grow the transaction
|
|
* optimistically as we go. */
|
|
|
|
#define EXT4_MAX_TRANS_DATA 64U
|
|
|
|
/* We break up a large truncate or write transaction once the handle's
|
|
* buffer credits gets this low, we need either to extend the
|
|
* transaction or to start a new one. Reserve enough space here for
|
|
* inode, bitmap, superblock, group and indirection updates for at least
|
|
* one block, plus two quota updates. Quota allocations are not
|
|
* needed. */
|
|
|
|
#define EXT4_RESERVE_TRANS_BLOCKS 12U
|
|
|
|
/*
|
|
* Number of credits needed if we need to insert an entry into a
|
|
* directory. For each new index block, we need 4 blocks (old index
|
|
* block, new index block, bitmap block, bg summary). For normal
|
|
* htree directories there are 2 levels; if the largedir feature
|
|
* enabled it's 3 levels.
|
|
*/
|
|
#define EXT4_INDEX_EXTRA_TRANS_BLOCKS 12U
|
|
|
|
#ifdef CONFIG_QUOTA
|
|
/* Amount of blocks needed for quota update - we know that the structure was
|
|
* allocated so we need to update only data block */
|
|
#define EXT4_QUOTA_TRANS_BLOCKS(sb) ((test_opt(sb, QUOTA) ||\
|
|
ext4_has_feature_quota(sb)) ? 1 : 0)
|
|
/* Amount of blocks needed for quota insert/delete - we do some block writes
|
|
* but inode, sb and group updates are done only once */
|
|
#define EXT4_QUOTA_INIT_BLOCKS(sb) ((test_opt(sb, QUOTA) ||\
|
|
ext4_has_feature_quota(sb)) ?\
|
|
(DQUOT_INIT_ALLOC*(EXT4_SINGLEDATA_TRANS_BLOCKS(sb)-3)\
|
|
+3+DQUOT_INIT_REWRITE) : 0)
|
|
|
|
#define EXT4_QUOTA_DEL_BLOCKS(sb) ((test_opt(sb, QUOTA) ||\
|
|
ext4_has_feature_quota(sb)) ?\
|
|
(DQUOT_DEL_ALLOC*(EXT4_SINGLEDATA_TRANS_BLOCKS(sb)-3)\
|
|
+3+DQUOT_DEL_REWRITE) : 0)
|
|
#else
|
|
#define EXT4_QUOTA_TRANS_BLOCKS(sb) 0
|
|
#define EXT4_QUOTA_INIT_BLOCKS(sb) 0
|
|
#define EXT4_QUOTA_DEL_BLOCKS(sb) 0
|
|
#endif
|
|
#define EXT4_MAXQUOTAS_TRANS_BLOCKS(sb) (EXT4_MAXQUOTAS*EXT4_QUOTA_TRANS_BLOCKS(sb))
|
|
#define EXT4_MAXQUOTAS_INIT_BLOCKS(sb) (EXT4_MAXQUOTAS*EXT4_QUOTA_INIT_BLOCKS(sb))
|
|
#define EXT4_MAXQUOTAS_DEL_BLOCKS(sb) (EXT4_MAXQUOTAS*EXT4_QUOTA_DEL_BLOCKS(sb))
|
|
|
|
/*
|
|
* Ext4 handle operation types -- for logging purposes
|
|
*/
|
|
#define EXT4_HT_MISC 0
|
|
#define EXT4_HT_INODE 1
|
|
#define EXT4_HT_WRITE_PAGE 2
|
|
#define EXT4_HT_MAP_BLOCKS 3
|
|
#define EXT4_HT_DIR 4
|
|
#define EXT4_HT_TRUNCATE 5
|
|
#define EXT4_HT_QUOTA 6
|
|
#define EXT4_HT_RESIZE 7
|
|
#define EXT4_HT_MIGRATE 8
|
|
#define EXT4_HT_MOVE_EXTENTS 9
|
|
#define EXT4_HT_XATTR 10
|
|
#define EXT4_HT_EXT_CONVERT 11
|
|
#define EXT4_HT_MAX 12
|
|
|
|
/**
|
|
* struct ext4_journal_cb_entry - Base structure for callback information.
|
|
*
|
|
* This struct is a 'seed' structure for a using with your own callback
|
|
* structs. If you are using callbacks you must allocate one of these
|
|
* or another struct of your own definition which has this struct
|
|
* as it's first element and pass it to ext4_journal_callback_add().
|
|
*/
|
|
struct ext4_journal_cb_entry {
|
|
/* list information for other callbacks attached to the same handle */
|
|
struct list_head jce_list;
|
|
|
|
/* Function to call with this callback structure */
|
|
void (*jce_func)(struct super_block *sb,
|
|
struct ext4_journal_cb_entry *jce, int error);
|
|
|
|
/* user data goes here */
|
|
};
|
|
|
|
/**
|
|
* ext4_journal_callback_add: add a function to call after transaction commit
|
|
* @handle: active journal transaction handle to register callback on
|
|
* @func: callback function to call after the transaction has committed:
|
|
* @sb: superblock of current filesystem for transaction
|
|
* @jce: returned journal callback data
|
|
* @rc: journal state at commit (0 = transaction committed properly)
|
|
* @jce: journal callback data (internal and function private data struct)
|
|
*
|
|
* The registered function will be called in the context of the journal thread
|
|
* after the transaction for which the handle was created has completed.
|
|
*
|
|
* No locks are held when the callback function is called, so it is safe to
|
|
* call blocking functions from within the callback, but the callback should
|
|
* not block or run for too long, or the filesystem will be blocked waiting for
|
|
* the next transaction to commit. No journaling functions can be used, or
|
|
* there is a risk of deadlock.
|
|
*
|
|
* There is no guaranteed calling order of multiple registered callbacks on
|
|
* the same transaction.
|
|
*/
|
|
static inline void _ext4_journal_callback_add(handle_t *handle,
|
|
struct ext4_journal_cb_entry *jce)
|
|
{
|
|
/* Add the jce to transaction's private list */
|
|
list_add_tail(&jce->jce_list, &handle->h_transaction->t_private_list);
|
|
}
|
|
|
|
static inline void ext4_journal_callback_add(handle_t *handle,
|
|
void (*func)(struct super_block *sb,
|
|
struct ext4_journal_cb_entry *jce,
|
|
int rc),
|
|
struct ext4_journal_cb_entry *jce)
|
|
{
|
|
struct ext4_sb_info *sbi =
|
|
EXT4_SB(handle->h_transaction->t_journal->j_private);
|
|
|
|
/* Add the jce to transaction's private list */
|
|
jce->jce_func = func;
|
|
spin_lock(&sbi->s_md_lock);
|
|
_ext4_journal_callback_add(handle, jce);
|
|
spin_unlock(&sbi->s_md_lock);
|
|
}
|
|
|
|
|
|
/**
|
|
* ext4_journal_callback_del: delete a registered callback
|
|
* @handle: active journal transaction handle on which callback was registered
|
|
* @jce: registered journal callback entry to unregister
|
|
* Return true if object was successfully removed
|
|
*/
|
|
static inline bool ext4_journal_callback_try_del(handle_t *handle,
|
|
struct ext4_journal_cb_entry *jce)
|
|
{
|
|
bool deleted;
|
|
struct ext4_sb_info *sbi =
|
|
EXT4_SB(handle->h_transaction->t_journal->j_private);
|
|
|
|
spin_lock(&sbi->s_md_lock);
|
|
deleted = !list_empty(&jce->jce_list);
|
|
list_del_init(&jce->jce_list);
|
|
spin_unlock(&sbi->s_md_lock);
|
|
return deleted;
|
|
}
|
|
|
|
int
|
|
ext4_mark_iloc_dirty(handle_t *handle,
|
|
struct inode *inode,
|
|
struct ext4_iloc *iloc);
|
|
|
|
/*
|
|
* On success, We end up with an outstanding reference count against
|
|
* iloc->bh. This _must_ be cleaned up later.
|
|
*/
|
|
|
|
int ext4_reserve_inode_write(handle_t *handle, struct inode *inode,
|
|
struct ext4_iloc *iloc);
|
|
|
|
int ext4_mark_inode_dirty(handle_t *handle, struct inode *inode);
|
|
|
|
int ext4_expand_extra_isize(struct inode *inode,
|
|
unsigned int new_extra_isize,
|
|
struct ext4_iloc *iloc);
|
|
/*
|
|
* Wrapper functions with which ext4 calls into JBD.
|
|
*/
|
|
int __ext4_journal_get_write_access(const char *where, unsigned int line,
|
|
handle_t *handle, struct buffer_head *bh);
|
|
|
|
int __ext4_forget(const char *where, unsigned int line, handle_t *handle,
|
|
int is_metadata, struct inode *inode,
|
|
struct buffer_head *bh, ext4_fsblk_t blocknr);
|
|
|
|
int __ext4_journal_get_create_access(const char *where, unsigned int line,
|
|
handle_t *handle, struct buffer_head *bh);
|
|
|
|
int __ext4_handle_dirty_metadata(const char *where, unsigned int line,
|
|
handle_t *handle, struct inode *inode,
|
|
struct buffer_head *bh);
|
|
|
|
int __ext4_handle_dirty_super(const char *where, unsigned int line,
|
|
handle_t *handle, struct super_block *sb);
|
|
|
|
#define ext4_journal_get_write_access(handle, bh) \
|
|
__ext4_journal_get_write_access(__func__, __LINE__, (handle), (bh))
|
|
#define ext4_forget(handle, is_metadata, inode, bh, block_nr) \
|
|
__ext4_forget(__func__, __LINE__, (handle), (is_metadata), (inode), \
|
|
(bh), (block_nr))
|
|
#define ext4_journal_get_create_access(handle, bh) \
|
|
__ext4_journal_get_create_access(__func__, __LINE__, (handle), (bh))
|
|
#define ext4_handle_dirty_metadata(handle, inode, bh) \
|
|
__ext4_handle_dirty_metadata(__func__, __LINE__, (handle), (inode), \
|
|
(bh))
|
|
#define ext4_handle_dirty_super(handle, sb) \
|
|
__ext4_handle_dirty_super(__func__, __LINE__, (handle), (sb))
|
|
|
|
handle_t *__ext4_journal_start_sb(struct super_block *sb, unsigned int line,
|
|
int type, int blocks, int rsv_blocks);
|
|
int __ext4_journal_stop(const char *where, unsigned int line, handle_t *handle);
|
|
|
|
#define EXT4_NOJOURNAL_MAX_REF_COUNT ((unsigned long) 4096)
|
|
|
|
/* Note: Do not use this for NULL handles. This is only to determine if
|
|
* a properly allocated handle is using a journal or not. */
|
|
static inline int ext4_handle_valid(handle_t *handle)
|
|
{
|
|
if ((unsigned long)handle < EXT4_NOJOURNAL_MAX_REF_COUNT)
|
|
return 0;
|
|
return 1;
|
|
}
|
|
|
|
static inline void ext4_handle_sync(handle_t *handle)
|
|
{
|
|
if (ext4_handle_valid(handle))
|
|
handle->h_sync = 1;
|
|
}
|
|
|
|
static inline int ext4_handle_is_aborted(handle_t *handle)
|
|
{
|
|
if (ext4_handle_valid(handle))
|
|
return is_handle_aborted(handle);
|
|
return 0;
|
|
}
|
|
|
|
static inline int ext4_handle_has_enough_credits(handle_t *handle, int needed)
|
|
{
|
|
if (ext4_handle_valid(handle) && handle->h_buffer_credits < needed)
|
|
return 0;
|
|
return 1;
|
|
}
|
|
|
|
#define ext4_journal_start_sb(sb, type, nblocks) \
|
|
__ext4_journal_start_sb((sb), __LINE__, (type), (nblocks), 0)
|
|
|
|
#define ext4_journal_start(inode, type, nblocks) \
|
|
__ext4_journal_start((inode), __LINE__, (type), (nblocks), 0)
|
|
|
|
#define ext4_journal_start_with_reserve(inode, type, blocks, rsv_blocks) \
|
|
__ext4_journal_start((inode), __LINE__, (type), (blocks), (rsv_blocks))
|
|
|
|
static inline handle_t *__ext4_journal_start(struct inode *inode,
|
|
unsigned int line, int type,
|
|
int blocks, int rsv_blocks)
|
|
{
|
|
return __ext4_journal_start_sb(inode->i_sb, line, type, blocks,
|
|
rsv_blocks);
|
|
}
|
|
|
|
#define ext4_journal_stop(handle) \
|
|
__ext4_journal_stop(__func__, __LINE__, (handle))
|
|
|
|
#define ext4_journal_start_reserved(handle, type) \
|
|
__ext4_journal_start_reserved((handle), __LINE__, (type))
|
|
|
|
handle_t *__ext4_journal_start_reserved(handle_t *handle, unsigned int line,
|
|
int type);
|
|
|
|
static inline void ext4_journal_free_reserved(handle_t *handle)
|
|
{
|
|
if (ext4_handle_valid(handle))
|
|
jbd2_journal_free_reserved(handle);
|
|
}
|
|
|
|
static inline handle_t *ext4_journal_current_handle(void)
|
|
{
|
|
return journal_current_handle();
|
|
}
|
|
|
|
static inline int ext4_journal_extend(handle_t *handle, int nblocks)
|
|
{
|
|
if (ext4_handle_valid(handle))
|
|
return jbd2_journal_extend(handle, nblocks);
|
|
return 0;
|
|
}
|
|
|
|
static inline int ext4_journal_restart(handle_t *handle, int nblocks)
|
|
{
|
|
if (ext4_handle_valid(handle))
|
|
return jbd2_journal_restart(handle, nblocks);
|
|
return 0;
|
|
}
|
|
|
|
static inline int ext4_journal_blocks_per_page(struct inode *inode)
|
|
{
|
|
if (EXT4_JOURNAL(inode) != NULL)
|
|
return jbd2_journal_blocks_per_page(inode);
|
|
return 0;
|
|
}
|
|
|
|
static inline int ext4_journal_force_commit(journal_t *journal)
|
|
{
|
|
if (journal)
|
|
return jbd2_journal_force_commit(journal);
|
|
return 0;
|
|
}
|
|
|
|
static inline int ext4_jbd2_inode_add_write(handle_t *handle,
|
|
struct inode *inode, loff_t start_byte, loff_t length)
|
|
{
|
|
if (ext4_handle_valid(handle))
|
|
return jbd2_journal_inode_ranged_write(handle,
|
|
EXT4_I(inode)->jinode, start_byte, length);
|
|
return 0;
|
|
}
|
|
|
|
static inline int ext4_jbd2_inode_add_wait(handle_t *handle,
|
|
struct inode *inode, loff_t start_byte, loff_t length)
|
|
{
|
|
if (ext4_handle_valid(handle))
|
|
return jbd2_journal_inode_ranged_wait(handle,
|
|
EXT4_I(inode)->jinode, start_byte, length);
|
|
return 0;
|
|
}
|
|
|
|
static inline void ext4_update_inode_fsync_trans(handle_t *handle,
|
|
struct inode *inode,
|
|
int datasync)
|
|
{
|
|
struct ext4_inode_info *ei = EXT4_I(inode);
|
|
|
|
if (ext4_handle_valid(handle) && !is_handle_aborted(handle)) {
|
|
ei->i_sync_tid = handle->h_transaction->t_tid;
|
|
if (datasync)
|
|
ei->i_datasync_tid = handle->h_transaction->t_tid;
|
|
}
|
|
}
|
|
|
|
/* super.c */
|
|
int ext4_force_commit(struct super_block *sb);
|
|
|
|
/*
|
|
* Ext4 inode journal modes
|
|
*/
|
|
#define EXT4_INODE_JOURNAL_DATA_MODE 0x01 /* journal data mode */
|
|
#define EXT4_INODE_ORDERED_DATA_MODE 0x02 /* ordered data mode */
|
|
#define EXT4_INODE_WRITEBACK_DATA_MODE 0x04 /* writeback data mode */
|
|
|
|
static inline int ext4_inode_journal_mode(struct inode *inode)
|
|
{
|
|
if (EXT4_JOURNAL(inode) == NULL)
|
|
return EXT4_INODE_WRITEBACK_DATA_MODE; /* writeback */
|
|
/* We do not support data journalling with delayed allocation */
|
|
if (!S_ISREG(inode->i_mode) ||
|
|
test_opt(inode->i_sb, DATA_FLAGS) == EXT4_MOUNT_JOURNAL_DATA ||
|
|
(ext4_test_inode_flag(inode, EXT4_INODE_JOURNAL_DATA) &&
|
|
!test_opt(inode->i_sb, DELALLOC))) {
|
|
/* We do not support data journalling for encrypted data */
|
|
if (S_ISREG(inode->i_mode) && IS_ENCRYPTED(inode))
|
|
return EXT4_INODE_ORDERED_DATA_MODE; /* ordered */
|
|
return EXT4_INODE_JOURNAL_DATA_MODE; /* journal data */
|
|
}
|
|
if (test_opt(inode->i_sb, DATA_FLAGS) == EXT4_MOUNT_ORDERED_DATA)
|
|
return EXT4_INODE_ORDERED_DATA_MODE; /* ordered */
|
|
if (test_opt(inode->i_sb, DATA_FLAGS) == EXT4_MOUNT_WRITEBACK_DATA)
|
|
return EXT4_INODE_WRITEBACK_DATA_MODE; /* writeback */
|
|
BUG();
|
|
}
|
|
|
|
static inline int ext4_should_journal_data(struct inode *inode)
|
|
{
|
|
return ext4_inode_journal_mode(inode) & EXT4_INODE_JOURNAL_DATA_MODE;
|
|
}
|
|
|
|
static inline int ext4_should_order_data(struct inode *inode)
|
|
{
|
|
return ext4_inode_journal_mode(inode) & EXT4_INODE_ORDERED_DATA_MODE;
|
|
}
|
|
|
|
static inline int ext4_should_writeback_data(struct inode *inode)
|
|
{
|
|
return ext4_inode_journal_mode(inode) & EXT4_INODE_WRITEBACK_DATA_MODE;
|
|
}
|
|
|
|
/*
|
|
* This function controls whether or not we should try to go down the
|
|
* dioread_nolock code paths, which makes it safe to avoid taking
|
|
* i_mutex for direct I/O reads. This only works for extent-based
|
|
* files, and it doesn't work if data journaling is enabled, since the
|
|
* dioread_nolock code uses b_private to pass information back to the
|
|
* I/O completion handler, and this conflicts with the jbd's use of
|
|
* b_private.
|
|
*/
|
|
static inline int ext4_should_dioread_nolock(struct inode *inode)
|
|
{
|
|
if (!test_opt(inode->i_sb, DIOREAD_NOLOCK))
|
|
return 0;
|
|
if (!S_ISREG(inode->i_mode))
|
|
return 0;
|
|
if (!(ext4_test_inode_flag(inode, EXT4_INODE_EXTENTS)))
|
|
return 0;
|
|
if (ext4_should_journal_data(inode))
|
|
return 0;
|
|
return 1;
|
|
}
|
|
|
|
#endif /* _EXT4_JBD2_H */
|