On Mon, Jul 04, 2022 at 09:13:44AM +0800, Xiubo Li wrote: > On 7/1/22 6:38 PM, Jeff Layton wrote: > > I don't know here... I think it might be better to just expect that when > > this function returns an error that the folio has already been unlocked. > > Doing it this way will mean that you will lock and unlock the folio a > > second time for no reason. > > > > Maybe something like this instead? > > > > diff --git a/fs/netfs/buffered_read.c b/fs/netfs/buffered_read.c > > index 42f892c5712e..8ae7b0f4c909 100644 > > --- a/fs/netfs/buffered_read.c > > +++ b/fs/netfs/buffered_read.c > > @@ -353,7 +353,7 @@ int netfs_write_begin(struct netfs_inode *ctx, > > trace_netfs_failure(NULL, NULL, ret, netfs_fail_check_write_begin); > > if (ret == -EAGAIN) > > goto retry; > > - goto error; > > + goto error_unlocked; > > } > > } > > @@ -418,6 +418,7 @@ int netfs_write_begin(struct netfs_inode *ctx, > > error: > > folio_unlock(folio); > > folio_put(folio); > > +error_unlocked: > > _leave(" = %d", ret); > > return ret; > > } > > Then the "afs" won't work correctly: > > 377 static int afs_check_write_begin(struct file *file, loff_t pos, unsigned > len, > 378 struct folio *folio, void **_fsdata) > 379 { > 380 struct afs_vnode *vnode = AFS_FS_I(file_inode(file)); > 381 > 382 return test_bit(AFS_VNODE_DELETED, &vnode->flags) ? -ESTALE : 0; > 383 } > > The "afs" does nothing with the folio lock. It's OK to fix AFS too.