Messages in this thread Patch in this message | | | Date | Thu, 04 Jul 2002 16:54:33 -0700 | From | Andrew Morton <> | Subject | [patch 14/27] check for O_DIRECT capability in open(), not write() |
| |
For O_DIRECT opens we're currently checking that the fs supports O_DIRECT at write(2)-time.
This is a forward-port of Andrea's patch which moves the check to open() time. Seems more sensible.
fs/fcntl.c | 5 +++++ fs/open.c | 8 ++++++++ mm/filemap.c | 2 -- 3 files changed, 13 insertions(+), 2 deletions(-)
--- 2.5.24/fs/fcntl.c~o_direct-open-check Thu Jul 4 16:17:24 2002 +++ 2.5.24-akpm/fs/fcntl.c Thu Jul 4 16:17:24 2002 @@ -245,6 +245,11 @@ 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) + return -EINVAL; + } + /* * alloc_kiovec() can sleep and we are only serialized by * the big kernel lock here, so abuse the i_sem to serialize --- 2.5.24/fs/open.c~o_direct-open-check Thu Jul 4 16:17:24 2002 +++ 2.5.24-akpm/fs/open.c Thu Jul 4 16:17:24 2002 @@ -665,6 +665,14 @@ struct file *dentry_open(struct dentry * } f->f_flags &= ~(O_CREAT | O_EXCL | O_NOCTTY | O_TRUNC); + /* 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) + goto cleanup_all; + } + return f; cleanup_all: --- 2.5.24/mm/filemap.c~o_direct-open-check Thu Jul 4 16:17:24 2002 +++ 2.5.24-akpm/mm/filemap.c Thu Jul 4 16:22:09 2002 @@ -1121,8 +1121,6 @@ static ssize_t generic_file_direct_IO(in retval = -EINVAL; if ((offset & blocksize_mask) || (count & blocksize_mask)) goto out_free; - if (!mapping->a_ops->direct_IO) - goto out_free; /* * Flush to disk exclusively the _data_, metadata must remain - - 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/
| |