diff --git a/fs/overlayfs/file.c b/fs/overlayfs/file.c index 9242713596f4a1..45f83d9cac409e 100644 --- a/fs/overlayfs/file.c +++ b/fs/overlayfs/file.c @@ -252,6 +252,9 @@ static void ovl_aio_cleanup_handler(struct ovl_aio_req *aio_req) if (iocb->ki_flags & IOCB_WRITE) { struct inode *inode = file_inode(orig_iocb->ki_filp); + /* Actually acquired in ovl_write_iter() */ + __sb_writers_acquired(file_inode(iocb->ki_filp)->i_sb, + SB_FREEZE_WRITE); file_end_write(iocb->ki_filp); ovl_copyattr(ovl_inode_real(inode), inode); } @@ -342,8 +345,8 @@ static ssize_t ovl_write_iter(struct kiocb *iocb, struct iov_iter *iter) ifl &= ~(IOCB_DSYNC | IOCB_SYNC); old_cred = ovl_override_creds(file_inode(file)->i_sb); - file_start_write(real.file); if (is_sync_kiocb(iocb)) { + file_start_write(real.file); ret = vfs_iter_write(real.file, iter, &iocb->ki_pos, ovl_iocb_to_rwf(ifl)); file_end_write(real.file); @@ -355,11 +358,14 @@ static ssize_t ovl_write_iter(struct kiocb *iocb, struct iov_iter *iter) GFP_NOFS); if (!aio_req) { ret = -ENOMEM; - file_end_write(real.file); fdput(real); goto out_revert; } + file_start_write(real.file); + /* Pacify lockdep, same trick as done in aio_write() */ + __sb_writers_release(file_inode(real.file)->i_sb, + SB_FREEZE_WRITE); aio_req->fd = real; aio_req->orig_iocb = iocb; kiocb_clone(&aio_req->iocb, iocb, real.file);