->writepage() is supposed to return zero or a negative error code. Returning the number of bytes written will confuse the VFS. --- 25-akpm/fs/smbfs/file.c | 22 ++++++++++++---------- 1 files changed, 12 insertions(+), 10 deletions(-) diff -puN fs/smbfs/file.c~smb_writepage-retval-fix fs/smbfs/file.c --- 25/fs/smbfs/file.c~smb_writepage-retval-fix 2004-04-23 00:07:53.253665104 -0700 +++ 25-akpm/fs/smbfs/file.c 2004-04-23 00:12:27.515970896 -0700 @@ -121,31 +121,33 @@ smb_writepage_sync(struct inode *inode, char *buffer = kmap(page) + pageoffset; struct smb_sb_info *server = server_from_inode(inode); unsigned int wsize = smb_get_wsize(server); - int result, written = 0; + int ret = 0; offset = ((loff_t)page->index << PAGE_CACHE_SHIFT) + pageoffset; VERBOSE("file ino=%ld, fileid=%d, count=%d@%Ld, wsize=%d\n", inode->i_ino, SMB_I(inode)->fileid, count, offset, wsize); do { + int write_ret; + if (count < wsize) wsize = count; - result = server->ops->write(inode, offset, wsize, buffer); - if (result < 0) { - PARANOIA("failed write, wsize=%d, result=%d\n", - wsize, result); + write_ret = server->ops->write(inode, offset, wsize, buffer); + if (write_ret < 0) { + PARANOIA("failed write, wsize=%d, write_ret=%d\n", + wsize, write_ret); + ret = write_ret; break; } /* N.B. what if result < wsize?? */ #ifdef SMBFS_PARANOIA - if (result < wsize) - PARANOIA("short write, wsize=%d, result=%d\n", - wsize, result); + if (write_ret < wsize) + PARANOIA("short write, wsize=%d, write_ret=%d\n", + wsize, write_ret); #endif buffer += wsize; offset += wsize; - written += wsize; count -= wsize; /* * Update the inode now rather than waiting for a refresh. @@ -157,7 +159,7 @@ smb_writepage_sync(struct inode *inode, } while (count); kunmap(page); - return written ? written : result; + return ret; } /* _