[patch 5/13] O_DIRECT open check

Andrew Morton (akpm@zip.com.au)
Tue, 16 Jul 2002 22:29:44 -0700


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(-)

--- 2.5.26/fs/fcntl.c~o_direct_open_check Tue Jul 16 21:46:32 2002
+++ 2.5.26-akpm/fs/fcntl.c Tue Jul 16 21:59:37 2002
@@ -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
--- 2.5.26/fs/open.c~o_direct_open_check Tue Jul 16 21:46:32 2002
+++ 2.5.26-akpm/fs/open.c Tue Jul 16 21:59:37 2002
@@ -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;

.
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/