Skip to content

Commit b60be02

Browse files
committed
Merge tag 'ovl-fixes-5.15-rc5' of git://git.kernel.org/pub/scm/linux/kernel/git/mszeredi/vfs
Pull overlayfs fixes from Miklos Szeredi: "Fix two bugs, both of them corner cases not affecting most users" * tag 'ovl-fixes-5.15-rc5' of git://git.kernel.org/pub/scm/linux/kernel/git/mszeredi/vfs: ovl: fix IOCB_DIRECT if underlying fs doesn't support direct IO ovl: fix missing negative dentry check in ovl_rename()
2 parents df5c188 + 1dc1eed commit b60be02

File tree

2 files changed

+21
-4
lines changed

2 files changed

+21
-4
lines changed

fs/overlayfs/dir.c

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1219,9 +1219,13 @@ static int ovl_rename(struct user_namespace *mnt_userns, struct inode *olddir,
12191219
goto out_dput;
12201220
}
12211221
} else {
1222-
if (!d_is_negative(newdentry) &&
1223-
(!new_opaque || !ovl_is_whiteout(newdentry)))
1224-
goto out_dput;
1222+
if (!d_is_negative(newdentry)) {
1223+
if (!new_opaque || !ovl_is_whiteout(newdentry))
1224+
goto out_dput;
1225+
} else {
1226+
if (flags & RENAME_EXCHANGE)
1227+
goto out_dput;
1228+
}
12251229
}
12261230

12271231
if (olddentry == trap)

fs/overlayfs/file.c

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -296,6 +296,12 @@ static ssize_t ovl_read_iter(struct kiocb *iocb, struct iov_iter *iter)
296296
if (ret)
297297
return ret;
298298

299+
ret = -EINVAL;
300+
if (iocb->ki_flags & IOCB_DIRECT &&
301+
(!real.file->f_mapping->a_ops ||
302+
!real.file->f_mapping->a_ops->direct_IO))
303+
goto out_fdput;
304+
299305
old_cred = ovl_override_creds(file_inode(file)->i_sb);
300306
if (is_sync_kiocb(iocb)) {
301307
ret = vfs_iter_read(real.file, iter, &iocb->ki_pos,
@@ -320,7 +326,7 @@ static ssize_t ovl_read_iter(struct kiocb *iocb, struct iov_iter *iter)
320326
out:
321327
revert_creds(old_cred);
322328
ovl_file_accessed(file);
323-
329+
out_fdput:
324330
fdput(real);
325331

326332
return ret;
@@ -349,6 +355,12 @@ static ssize_t ovl_write_iter(struct kiocb *iocb, struct iov_iter *iter)
349355
if (ret)
350356
goto out_unlock;
351357

358+
ret = -EINVAL;
359+
if (iocb->ki_flags & IOCB_DIRECT &&
360+
(!real.file->f_mapping->a_ops ||
361+
!real.file->f_mapping->a_ops->direct_IO))
362+
goto out_fdput;
363+
352364
if (!ovl_should_sync(OVL_FS(inode->i_sb)))
353365
ifl &= ~(IOCB_DSYNC | IOCB_SYNC);
354366

@@ -384,6 +396,7 @@ static ssize_t ovl_write_iter(struct kiocb *iocb, struct iov_iter *iter)
384396
}
385397
out:
386398
revert_creds(old_cred);
399+
out_fdput:
387400
fdput(real);
388401

389402
out_unlock:

0 commit comments

Comments
 (0)