Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

9p: fold v9fs_file_write_internal() into the caller

Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>

Al Viro c711a6b1 371098c6

+30 -49
-2
fs/9p/v9fs_vfs.h
··· 74 74 int v9fs_vfs_setattr_dotl(struct dentry *, struct iattr *); 75 75 int v9fs_file_fsync_dotl(struct file *filp, loff_t start, loff_t end, 76 76 int datasync); 77 - ssize_t v9fs_file_write_internal(struct inode *, struct p9_fid *, 78 - const char __user *, size_t, loff_t *, int); 79 77 int v9fs_refresh_inode(struct p9_fid *fid, struct inode *inode); 80 78 int v9fs_refresh_inode_dotl(struct p9_fid *fid, struct inode *inode); 81 79 static inline void v9fs_invalidate_inode_attr(struct inode *inode)
+30 -47
fs/9p/vfs_file.c
··· 453 453 return ret; 454 454 } 455 455 456 - ssize_t 457 - v9fs_file_write_internal(struct inode *inode, struct p9_fid *fid, 458 - const char __user *data, size_t count, 459 - loff_t *offset, int invalidate) 460 - { 461 - loff_t origin = *offset; 462 - struct iovec iov = {.iov_base = (void __user *)data, .iov_len = count}; 463 - struct iov_iter from; 464 - int total, err = 0; 465 - 466 - p9_debug(P9_DEBUG_VFS, "data %p count %d offset %x\n", 467 - data, (int)count, (int)*offset); 468 - 469 - iov_iter_init(&from, WRITE, &iov, 1, count); 470 - 471 - total = p9_client_write(fid, origin, &from, &err); 472 - if (invalidate && (total > 0)) { 473 - loff_t i_size; 474 - unsigned long pg_start, pg_end; 475 - pg_start = origin >> PAGE_CACHE_SHIFT; 476 - pg_end = (origin + total - 1) >> PAGE_CACHE_SHIFT; 477 - if (inode->i_mapping && inode->i_mapping->nrpages) 478 - invalidate_inode_pages2_range(inode->i_mapping, 479 - pg_start, pg_end); 480 - *offset += total; 481 - i_size = i_size_read(inode); 482 - if (*offset > i_size) { 483 - inode_add_bytes(inode, *offset - i_size); 484 - i_size_write(inode, *offset); 485 - } 486 - } 487 - return total ? total : err; 488 - } 489 - 490 456 /** 491 457 * v9fs_file_write - write to a file 492 458 * @filp: file pointer to write ··· 467 501 { 468 502 ssize_t retval = 0; 469 503 loff_t origin = *offset; 504 + struct iovec iov = {.iov_base = (void __user *)data, .iov_len = count}; 505 + struct iov_iter from; 506 + int err = 0; 470 507 508 + iov_iter_init(&from, WRITE, &iov, 1, count); 471 509 472 510 retval = generic_write_checks(filp, &origin, &count, 0); 473 511 if (retval) 474 - goto out; 512 + return retval; 475 513 476 - retval = -EINVAL; 477 - if ((ssize_t) count < 0) 478 - goto out; 514 + iov_iter_truncate(&from, count); 515 + 516 + p9_debug(P9_DEBUG_VFS, "data %p count %d offset %x\n", 517 + data, (int)count, (int)*offset); 518 + 479 519 retval = 0; 480 520 if (!count) 481 - goto out; 521 + return 0; 482 522 483 - retval = v9fs_file_write_internal(file_inode(filp), 484 - filp->private_data, 485 - data, count, &origin, 1); 486 - /* update offset on successful write */ 487 - if (retval > 0) 488 - *offset = origin; 489 - out: 490 - return retval; 523 + retval = p9_client_write(filp->private_data, origin, &from, &err); 524 + if (retval > 0) { 525 + struct inode *inode = file_inode(filp); 526 + loff_t i_size; 527 + unsigned long pg_start, pg_end; 528 + pg_start = origin >> PAGE_CACHE_SHIFT; 529 + pg_end = (origin + retval - 1) >> PAGE_CACHE_SHIFT; 530 + if (inode->i_mapping && inode->i_mapping->nrpages) 531 + invalidate_inode_pages2_range(inode->i_mapping, 532 + pg_start, pg_end); 533 + *offset += retval; 534 + i_size = i_size_read(inode); 535 + if (*offset > i_size) { 536 + inode_add_bytes(inode, *offset - i_size); 537 + i_size_write(inode, *offset); 538 + } 539 + return retval; 540 + } 541 + return err; 491 542 } 492 543 493 544