cifs: read/write operation fixes and cleanups
PATCH 1/1 cifs: read/write operation fixes and cleanups
- support vectored and async aio ops unconditionally - this is above the pagecache and transparent to the fs
- remove cifs_read_wrapper. it was only doing silly checks and calling generic_file_write in all cases.
- use do_sync_read/do_sync_write as read/write operations. They call ->readv/->writev which we now always implemente.
- add the filemap_fdatawrite calls to writev/aio_write which were missing previously compared to plain write. no idea what the point behind them is, but let's be consistent at least..
Signed-off-by Christoph Hellwig <[email protected]>
fs/cifs/cifsfs.c +21 -48
@@ -443,57 +443,30 @@return sb; } -static ssize_t -cifs_read_wrapper (struct file * file,char __user *read_data,size_t read_size, -loff_t * poffset) -{ -if (file->f_dentry ==NULL ) -return -EIO ; -else if (file->f_dentry->d_inode ==NULL ) -return -EIO ; - -cFYI (1 ,("In read_wrapper size %zd at %lld" ,read_size,*poffset)); +static ssize_t cifs_file_writev (struct file *file,const struct iovec *iov, +unsigned long nr_segs,loff_t *ppos) +{ +struct inode *inode = file->f_dentry->d_inode; +ssize_t written; -if (CIFS_I (file->f_dentry->d_inode)->clientCanCacheRead) { -return generic_file_read (file,read_data,read_size,poffset); - }else { -/* BB do we need to lock inode from here until after invalidate? */ -/* if(file->f_dentry->d_inode->i_mapping) { -filemap_fdatawrite(file->f_dentry->d_inode->i_mapping); -filemap_fdatawait(file->f_dentry->d_inode->i_mapping); -}*/ -/* cifs_revalidate(file->f_dentry);*/ /* BB fixme */ - -/* BB we should make timer configurable - perhaps -by simply calling cifs_revalidate here */ -/* invalidate_remote_inode(file->f_dentry->d_inode);*/ -return generic_file_read (file,read_data,read_size,poffset); - } + written =generic_file_writev (file, iov, nr_segs, ppos); +if (!CIFS_I (inode)->clientCanCacheAll) +filemap_fdatawrite (inode->i_mapping); +return written; } -static ssize_t -cifs_write_wrapper (struct file * file,const char __user *write_data, -size_t write_size,loff_t * poffset) +static ssize_t cifs_file_aio_write (struct kiocb *iocb,const char __user *buf, +size_t count,loff_t pos) { +struct inode *inode = iocb->ki_filp->f_dentry->d_inode;ssize_t written; -if (file->f_dentry ==NULL ) -return -EIO ; -else if (file->f_dentry->d_inode ==NULL ) -return -EIO ; - -cFYI (1 ,("In write_wrapper size %zd at %lld" ,write_size,*poffset)); - - written =generic_file_write (file,write_data,write_size,poffset); -if (!CIFS_I (file->f_dentry->d_inode)->clientCanCacheAll) { -if (file->f_dentry->d_inode->i_mapping) { -filemap_fdatawrite (file->f_dentry->d_inode->i_mapping); - } - } + written =generic_file_aio_write (iocb, buf, count, pos); +if (!CIFS_I (inode)->clientCanCacheAll) +filemap_fdatawrite (inode->i_mapping);return written; } -static struct file_system_type cifs_fs_type = { .owner =THIS_MODULE , .name ="cifs" ,
@@ -554,8 +527,12 @@ };struct file_operations cifs_file_ops = { - .read = cifs_read_wrapper, - .write = cifs_write_wrapper, + .read = do_sync_read, + .write = do_sync_write, + .readv = generic_file_readv, + .writev = cifs_file_writev, + .aio_read = generic_file_aio_read, + .aio_write = cifs_file_aio_write, .open = cifs_open, .release = cifs_close, .lock = cifs_lock,
@@ -568,10 +545,6 @@#endif /* CONFIG_CIFS_POSIX */ #ifdef CONFIG_CIFS_EXPERIMENTAL - .readv = generic_file_readv, - .writev = generic_file_writev, - .aio_read = generic_file_aio_read, - .aio_write = generic_file_aio_write, .dir_notify = cifs_dir_notify,#endif /* CONFIG_CIFS_EXPERIMENTAL */ };