O_DIRECT open check
Subsystems (2)
PATCH 5/13 O_DIRECT open check
Updated forward-port of Aodrea's O_DIRECT open() checks. If the user asked for O_DIRECT and the inode has no mapping or no a_ops then fail the open up-front.
fcntl.c | 5 ++--- open.c | 7 ++++--- 2 files changed, 6 insertions(+), 6 deletions(-)
fs/fcntl.c renamed from fs/fcntl.c~o_direct_open_check +2 -3
@@ -245,10 +245,9 @@ static int setfl(int fd, struct file * f }if (arg &O_DIRECT ) { -if (inode->i_mapping && inode->i_mapping->a_ops) { -if (!inode->i_mapping->a_ops->direct_IO) +if (!inode->i_mapping || !inode->i_mapping->a_ops || + !inode->i_mapping->a_ops->direct_IO)return -EINVAL ; - }/* * alloc_kiovec() can sleep and we are only serialized by
fs/open.c renamed from fs/open.c~o_direct_open_check +4 -3
@@ -665,10 +665,11 @@ struct file *dentry_open(struct dentry */* NB: we're sure to have correct a_ops only after f_op->open */ if (f->f_flags &O_DIRECT ) { - error = -EINVAL ; -if (inode->i_mapping && inode->i_mapping->a_ops) -if (!inode->i_mapping->a_ops->direct_IO) +if (!inode->i_mapping || !inode->i_mapping->a_ops || + !inode->i_mapping->a_ops->direct_IO) { + error = -EINVAL ; goto cleanup_all; + } }return f;
.