Skip to contentSkip to conversation

O_DIRECT open check

PATCH In review Andrew Morton 1 participant 1 message Jul 17, 2002

Subsystems (2)
lore
Share & tools
lore
#0 lore raw

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;

.