diff options
Diffstat (limited to 'fs/afs/write.c')
| -rw-r--r-- | fs/afs/write.c | 32 | 
1 files changed, 25 insertions, 7 deletions
| diff --git a/fs/afs/write.c b/fs/afs/write.c index c0534697268e..f24370f5c774 100644 --- a/fs/afs/write.c +++ b/fs/afs/write.c @@ -137,7 +137,7 @@ int afs_write_end(struct file *file, struct address_space *mapping,  		write_seqlock(&vnode->cb_lock);  		i_size = i_size_read(&vnode->vfs_inode);  		if (maybe_i_size > i_size) -			i_size_write(&vnode->vfs_inode, maybe_i_size); +			afs_set_i_size(vnode, maybe_i_size);  		write_sequnlock(&vnode->cb_lock);  	} @@ -471,13 +471,18 @@ static void afs_extend_writeback(struct address_space *mapping,  			}  			/* Has the page moved or been split? */ -			if (unlikely(page != xas_reload(&xas))) +			if (unlikely(page != xas_reload(&xas))) { +				put_page(page);  				break; +			} -			if (!trylock_page(page)) +			if (!trylock_page(page)) { +				put_page(page);  				break; +			}  			if (!PageDirty(page) || PageWriteback(page)) {  				unlock_page(page); +				put_page(page);  				break;  			} @@ -487,6 +492,7 @@ static void afs_extend_writeback(struct address_space *mapping,  			t = afs_page_dirty_to(page, priv);  			if (f != 0 && !new_content) {  				unlock_page(page); +				put_page(page);  				break;  			} @@ -801,6 +807,7 @@ int afs_writepages(struct address_space *mapping,  ssize_t afs_file_write(struct kiocb *iocb, struct iov_iter *from)  {  	struct afs_vnode *vnode = AFS_FS_I(file_inode(iocb->ki_filp)); +	struct afs_file *af = iocb->ki_filp->private_data;  	ssize_t result;  	size_t count = iov_iter_count(from); @@ -816,6 +823,10 @@ ssize_t afs_file_write(struct kiocb *iocb, struct iov_iter *from)  	if (!count)  		return 0; +	result = afs_validate(vnode, af->key); +	if (result < 0) +		return result; +  	result = generic_file_write_iter(iocb, from);  	_leave(" = %zd", result); @@ -829,13 +840,18 @@ ssize_t afs_file_write(struct kiocb *iocb, struct iov_iter *from)   */  int afs_fsync(struct file *file, loff_t start, loff_t end, int datasync)  { -	struct inode *inode = file_inode(file); -	struct afs_vnode *vnode = AFS_FS_I(inode); +	struct afs_vnode *vnode = AFS_FS_I(file_inode(file)); +	struct afs_file *af = file->private_data; +	int ret;  	_enter("{%llx:%llu},{n=%pD},%d",  	       vnode->fid.vid, vnode->fid.vnode, file,  	       datasync); +	ret = afs_validate(vnode, af->key); +	if (ret < 0) +		return ret; +  	return file_write_and_wait_range(file, start, end);  } @@ -849,11 +865,14 @@ vm_fault_t afs_page_mkwrite(struct vm_fault *vmf)  	struct file *file = vmf->vma->vm_file;  	struct inode *inode = file_inode(file);  	struct afs_vnode *vnode = AFS_FS_I(inode); +	struct afs_file *af = file->private_data;  	unsigned long priv;  	vm_fault_t ret = VM_FAULT_RETRY;  	_enter("{{%llx:%llu}},{%lx}", vnode->fid.vid, vnode->fid.vnode, page->index); +	afs_validate(vnode, af->key); +  	sb_start_pagefault(inode->i_sb);  	/* Wait for the page to be written to the cache before we allow it to @@ -955,8 +974,7 @@ int afs_launder_page(struct page *page)  		iov_iter_bvec(&iter, WRITE, bv, 1, bv[0].bv_len);  		trace_afs_page_dirty(vnode, tracepoint_string("launder"), page); -		ret = afs_store_data(vnode, &iter, (loff_t)page->index * PAGE_SIZE, -				     true); +		ret = afs_store_data(vnode, &iter, page_offset(page) + f, true);  	}  	trace_afs_page_dirty(vnode, tracepoint_string("laundered"), page); |