lists.openwall.net | lists / announce owl-users owl-dev john-users john-dev passwdqc-users yescrypt popa3d-users / oss-security kernel-hardening musl sabotage tlsify passwords / crypt-dev xvendor / Bugtraq Full-Disclosure linux-kernel linux-netdev linux-ext4 linux-hardening PHC | |
Open Source and information security mailing list archives
| ||
|
Date: Wed, 14 Apr 2021 23:25:31 +0100 From: Matthew Wilcox <willy@...radead.org> To: Dave Chinner <david@...morbit.com> Cc: Jan Kara <jack@...e.cz>, linux-fsdevel@...r.kernel.org, linux-ext4@...r.kernel.org, linux-xfs@...r.kernel.org, Ted Tso <tytso@....edu>, Christoph Hellwig <hch@...radead.org>, Amir Goldstein <amir73il@...il.com> Subject: Re: [PATCH 2/7] mm: Protect operations adding pages to page cache with i_mapping_lock On Wed, Apr 14, 2021 at 10:01:13AM +1000, Dave Chinner wrote: > > + if (iocb->ki_flags & IOCB_NOWAIT) { > > + if (!down_read_trylock(&mapping->host->i_mapping_sem)) > > + return -EAGAIN; > > + } else { > > + down_read(&mapping->host->i_mapping_sem); > > + } > > We really need a lock primitive for this. The number of times this > exact lock pattern is being replicated all through the IO path is > getting out of hand. > > static inline bool > down_read_try_or_lock(struct rwsem *sem, bool try) > { > if (try) { > if (!down_read_trylock(sem)) > return false; > } else { > down_read(&mapping->host->i_mapping_sem); > } > return true; > } > > and the callers become: > > if (!down_read_try_or_lock(sem, (iocb->ki_flags & IOCB_NOWAIT))) > return -EAGAIN; I think that should be written: if (!iocb_read_lock(iocb, &rwsem)) return -EAGAIN; and implemented as: static inline int iocb_read_lock(struct kiocb *iocb, struct rwsem *sem) { if (iocb->ki_flags & IOCB_NOWAIT) return down_read_trylock(sem) ? 0 : -EAGAIN; return down_read_killable(sem); }
Powered by blists - more mailing lists