On Tue 13-04-21 13:57:46, Christoph Hellwig wrote: > > if (error == AOP_TRUNCATED_PAGE) > > put_page(page); > > + up_read(&mapping->host->i_mapping_sem); > > return error; > > Please add an unlock_mapping label above this up_read and consolidate > most of the other unlocks by jumping there (put_and_wait_on_page_locked > probablt can't use it). Yeah, I've actually simplified the labels even a bit more like: ... error = filemap_read_page(iocb->ki_filp, mapping, page); goto unlock_mapping; unlock: unlock_page(page); unlock_mapping: up_read(&mapping->host->i_mapping_sem); if (error == AOP_TRUNCATED_PAGE) put_page(page); return error; and everything now jumps to either unlock or unlock_mapping (except for put_and_wait_on_page_locked() case). > > truncated: > > unlock_page(page); > > @@ -2309,6 +2324,7 @@ static int filemap_update_page(struct kiocb *iocb, > > return AOP_TRUNCATED_PAGE; > > The trunated case actually seems to miss the unlock. > > Similarly I think filemap_fault would benefit from a common > unlock path. Right, thanks for catching that! Honza -- Jan Kara <jack@xxxxxxxx> SUSE Labs, CR