aboutsummaryrefslogtreecommitdiff
path: root/lib/crypto/mpi/mpi-bit.c
diff options
context:
space:
mode:
authorHugh Dickins <[email protected]>2023-08-03 22:46:11 -0700
committerChristian Brauner <[email protected]>2023-08-09 09:15:41 +0200
commit3c1b7528d8969a8e89c77cd5eb867503152547b1 (patch)
treeb7f9537285fda7be02a77fb7db264796f7e23b93 /lib/crypto/mpi/mpi-bit.c
parent2be4f05af71bb2a9958c5680c19e5a489636ff42 (diff)
shmem: move spinlock into shmem_recalc_inode() to fix quota support
Commit "shmem: fix quota lock nesting in huge hole handling" was not so good: Smatch caught shmem_recalc_inode()'s shmem_inode_unacct_blocks() descending into quota_send_warning(): where blocking GFP_NOFS is used, yet shmem_recalc_inode() is called holding the shmem inode's info->lock. Yes, both __dquot_alloc_space() and __dquot_free_space() are commented "This operation can block, but only after everything is updated" - when calling flush_warnings() at the end - both its print_warning() and its quota_send_warning() may block. Rework shmem_recalc_inode() to take the shmem inode's info->lock inside, and drop it before calling shmem_inode_unacct_blocks(). And why were the spin_locks disabling interrupts? That was just a relic from when shmem_charge() and shmem_uncharge() were called while holding i_pages xa_lock: stop disabling interrupts for info->lock now. To help stop me from making the same mistake again, add a might_sleep() into shmem_inode_acct_block() and shmem_inode_unacct_blocks(); and those functions have grown, so let the compiler decide whether to inline them. Reported-by: Dan Carpenter <[email protected]> Closes: https://lore.kernel.org/linux-fsdevel/[email protected]/ Signed-off-by: Hugh Dickins <[email protected]> Reviewed-by: Jan Kara <[email protected]> Message-Id: <[email protected]> Signed-off-by: Christian Brauner <[email protected]>
Diffstat (limited to 'lib/crypto/mpi/mpi-bit.c')
0 files changed, 0 insertions, 0 deletions