diff options
Diffstat (limited to 'fs/9p/vfs_file.c')
| -rw-r--r-- | fs/9p/vfs_file.c | 89 | 
1 files changed, 9 insertions, 80 deletions
diff --git a/fs/9p/vfs_file.c b/fs/9p/vfs_file.c index 11cd8d23f6f2..bae330c2f0cf 100644 --- a/fs/9p/vfs_file.c +++ b/fs/9p/vfs_file.c @@ -353,25 +353,15 @@ static ssize_t  v9fs_file_read_iter(struct kiocb *iocb, struct iov_iter *to)  {  	struct p9_fid *fid = iocb->ki_filp->private_data; -	int ret, err = 0;  	p9_debug(P9_DEBUG_VFS, "fid %d count %zu offset %lld\n",  		 fid->fid, iov_iter_count(to), iocb->ki_pos); -	if (!(fid->mode & P9L_DIRECT)) { -		p9_debug(P9_DEBUG_VFS, "(cached)\n"); -		return generic_file_read_iter(iocb, to); -	} - -	if (iocb->ki_filp->f_flags & O_NONBLOCK) -		ret = p9_client_read_once(fid, iocb->ki_pos, to, &err); -	else -		ret = p9_client_read(fid, iocb->ki_pos, to, &err); -	if (!ret) -		return err; +	if (fid->mode & P9L_DIRECT) +		return netfs_unbuffered_read_iter(iocb, to); -	iocb->ki_pos += ret; -	return ret; +	p9_debug(P9_DEBUG_VFS, "(cached)\n"); +	return netfs_file_read_iter(iocb, to);  }  /* @@ -407,46 +397,14 @@ v9fs_file_write_iter(struct kiocb *iocb, struct iov_iter *from)  {  	struct file *file = iocb->ki_filp;  	struct p9_fid *fid = file->private_data; -	ssize_t retval; -	loff_t origin; -	int err = 0;  	p9_debug(P9_DEBUG_VFS, "fid %d\n", fid->fid); -	if (!(fid->mode & (P9L_DIRECT | P9L_NOWRITECACHE))) { -		p9_debug(P9_DEBUG_CACHE, "(cached)\n"); -		return generic_file_write_iter(iocb, from); -	} +	if (fid->mode & (P9L_DIRECT | P9L_NOWRITECACHE)) +		return netfs_unbuffered_write_iter(iocb, from); -	retval = generic_write_checks(iocb, from); -	if (retval <= 0) -		return retval; - -	origin = iocb->ki_pos; -	retval = p9_client_write(file->private_data, iocb->ki_pos, from, &err); -	if (retval > 0) { -		struct inode *inode = file_inode(file); -		loff_t i_size; -		unsigned long pg_start, pg_end; - -		pg_start = origin >> PAGE_SHIFT; -		pg_end = (origin + retval - 1) >> PAGE_SHIFT; -		if (inode->i_mapping && inode->i_mapping->nrpages) -			invalidate_inode_pages2_range(inode->i_mapping, -						      pg_start, pg_end); -		iocb->ki_pos += retval; -		i_size = i_size_read(inode); -		if (iocb->ki_pos > i_size) { -			inode_add_bytes(inode, iocb->ki_pos - i_size); -			/* -			 * Need to serialize against i_size_write() in -			 * v9fs_stat2inode() -			 */ -			v9fs_i_size_write(inode, iocb->ki_pos); -		} -		return retval; -	} -	return err; +	p9_debug(P9_DEBUG_CACHE, "(cached)\n"); +	return netfs_file_write_iter(iocb, from);  }  static int v9fs_file_fsync(struct file *filp, loff_t start, loff_t end, @@ -519,36 +477,7 @@ v9fs_file_mmap(struct file *filp, struct vm_area_struct *vma)  static vm_fault_t  v9fs_vm_page_mkwrite(struct vm_fault *vmf)  { -	struct folio *folio = page_folio(vmf->page); -	struct file *filp = vmf->vma->vm_file; -	struct inode *inode = file_inode(filp); - - -	p9_debug(P9_DEBUG_VFS, "folio %p fid %lx\n", -		 folio, (unsigned long)filp->private_data); - -	/* Wait for the page to be written to the cache before we allow it to -	 * be modified.  We then assume the entire page will need writing back. -	 */ -#ifdef CONFIG_9P_FSCACHE -	if (folio_test_fscache(folio) && -	    folio_wait_fscache_killable(folio) < 0) -		return VM_FAULT_NOPAGE; -#endif - -	/* Update file times before taking page lock */ -	file_update_time(filp); - -	if (folio_lock_killable(folio) < 0) -		return VM_FAULT_RETRY; -	if (folio_mapping(folio) != inode->i_mapping) -		goto out_unlock; -	folio_wait_stable(folio); - -	return VM_FAULT_LOCKED; -out_unlock: -	folio_unlock(folio); -	return VM_FAULT_NOPAGE; +	return netfs_page_mkwrite(vmf, NULL);  }  static void v9fs_mmap_vm_close(struct vm_area_struct *vma)  |