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.
}
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
/* 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;