--- /dev/null
+#define _LARGEFILE64_SOURCE
+#include<stdio.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <unistd.h>
+#include <stdlib.h>
+
+int handle;
+
+#define N_WRITES 8000
+#define STRIDE 1000
+
+#define BUFFER_N 2000
+unsigned buffer[BUFFER_N];
+
+
+void set_buffer(int n)
+{
+ int i;
+ for(i = 0; i < BUFFER_N; i++)
+ buffer[i] = i + n;
+}
+
+void write_big_sparse_file(int h)
+{
+ int i;
+ off64_t offset = 0;
+ off64_t pos;
+ int n = sizeof(buffer);
+ int wrote;
+
+ for(i = 0; i < 4000; i++) {
+ set_buffer(i);
+ pos = lseek64(h, offset, SEEK_SET);
+ if(pos != offset) {
+ printf("mismatched seek pos %lld offset %lld\n",
+ pos, offset);
+ exit(1);
+ }
+ wrote = write(h, buffer, n);
+
+ if(wrote != n) {
+ printf("mismatched write wrote %d n %d\n", wrote, n);
+ exit(1);
+ }
+
+ offset += (STRIDE * sizeof(buffer));
+ }
+}
+
+
+
+
+void verify_big_sparse_file(int h)
+{
+}
+
+int main(int argc, char *argv[])
+{
+
+ if(argc < 2) {
+ printf("Gimme a file name!\n");
+ exit(1);
+ }
+
+ handle = open(argv[1], O_CREAT | O_RDWR | O_TRUNC, S_IREAD | S_IWRITE);
+
+ if(handle < 0) {
+ perror("opening file");
+ exit(1);
+ }
+
+ write_big_sparse_file(handle);
+ system("sudo echo 3 > /proc/sys/vm/drop_caches");
+ verify_big_sparse_file(handle);
+
+ printf("Job done\n");
+ return 0;
+}
if (page->index > end_index || !n_bytes) {
yaffs_trace(YAFFS_TRACE_OS,
- "yaffs_writepage at %08x, inode size = %08x!!",
- (unsigned)(page->index << PAGE_CACHE_SHIFT),
- (unsigned)inode->i_size);
+ "yaffs_writepage at %lld, inode size = %lld!!",
+ ((loff_t)page->index) << PAGE_CACHE_SHIFT,
+ inode->i_size);
yaffs_trace(YAFFS_TRACE_OS,
" -> don't care!!");
yaffs_gross_lock(dev);
yaffs_trace(YAFFS_TRACE_OS,
- "yaffs_writepage at %08x, size %08x",
- (unsigned)(page->index << PAGE_CACHE_SHIFT), n_bytes);
+ "yaffs_writepage at %lld, size %08x",
+ ((loff_t)page->index) << PAGE_CACHE_SHIFT, n_bytes);
yaffs_trace(YAFFS_TRACE_OS,
- "writepag0: obj = %05x, ino = %05x",
- (int)obj->variant.file_variant.file_size, (int)inode->i_size);
+ "writepag0: obj = %lld, ino = %lld",
+ obj->variant.file_variant.file_size, inode->i_size);
n_written = yaffs_wr_file(obj, buffer,
page->index << PAGE_CACHE_SHIFT, n_bytes, 0);
yaffs_touch_super(dev);
yaffs_trace(YAFFS_TRACE_OS,
- "writepag1: obj = %05x, ino = %05x",
- (int)obj->variant.file_variant.file_size, (int)inode->i_size);
+ "writepag1: obj = %lld, ino = %lld",
+ obj->variant.file_variant.file_size, inode->i_size);
yaffs_gross_unlock(dev);
addr = kva + offset_into_page;
yaffs_trace(YAFFS_TRACE_OS,
- "yaffs_write_end addr %p pos %x n_bytes %d",
- addr, (unsigned)pos, copied);
+ "yaffs_write_end addr %p pos %lld n_bytes %d",
+ addr, pos, copied);
ret = yaffs_file_write(filp, addr, copied, &pos);
int n_bytes = to - offset;
int n_written;
- unsigned spos = pos;
- unsigned saddr;
-
kva = kmap(pg);
addr = kva + offset;
- saddr = (unsigned)addr;
-
yaffs_trace(YAFFS_TRACE_OS,
- "yaffs_commit_write addr %x pos %x n_bytes %d",
- saddr, spos, n_bytes);
+ "yaffs_commit_write addr %p pos %lld n_bytes %d",
+ addr, pos, n_bytes);
n_written = yaffs_file_write(f, addr, n_bytes, &pos);
inode->i_nlink = yaffs_get_obj_link_count(obj);
yaffs_trace(YAFFS_TRACE_OS,
- "yaffs_fill_inode mode %x uid %d gid %d size %d count %d",
+ "yaffs_fill_inode mode %x uid %d gid %d size %lld count %d",
inode->i_mode, inode->i_uid, inode->i_gid,
- (int)inode->i_size, atomic_read(&inode->i_count));
+ inode->i_size, atomic_read(&inode->i_count));
switch (obj->yst_mode & S_IFMT) {
default: /* fifo, device or socket */
loff_t * pos)
{
struct yaffs_obj *obj;
- int n_written, ipos;
+ int n_written;
+ loff_t ipos;
struct inode *inode;
struct yaffs_dev *dev;
ipos = *pos;
yaffs_trace(YAFFS_TRACE_OS,
- "yaffs_file_write about to write writing %u(%x) bytes to object %d at %d(%x)",
- (unsigned)n, (unsigned)n, obj->obj_id, ipos, ipos);
+ "yaffs_file_write about to write writing %u(%x) bytes to object %d at %lld",
+ (unsigned)n, (unsigned)n, obj->obj_id, ipos);
n_written = yaffs_wr_file(obj, buf, ipos, n, 0);
inode->i_blocks = (ipos + 511) >> 9;
yaffs_trace(YAFFS_TRACE_OS,
- "yaffs_file_write size updated to %d bytes, %d blocks",
+ "yaffs_file_write size updated to %lld bytes, %d blocks",
ipos, (int)(inode->i_blocks));
}
yaffs_trace(YAFFS_TRACE_OS,
"yaffs_setattr of object %d",
yaffs_inode_to_obj(inode)->obj_id);
-
+#if 0
/* Fail if a requested resize >= 2GB */
if (attr->ia_valid & ATTR_SIZE && (attr->ia_size >> 31))
error = -EINVAL;
+#endif
if (error == 0)
error = inode_change_ok(inode, attr);