projects
/
yaffs2.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
yaffsfs: Allocate directory searches from a table rather than via malloc.
[yaffs2.git]
/
yaffs_guts.c
diff --git
a/yaffs_guts.c
b/yaffs_guts.c
index 146fb2b75ca5a7f3ae78cedd6cfda356da4d61dd..8acb59ba655bae1b3029c037e14acc1dd4e70a03 100644
(file)
--- a/
yaffs_guts.c
+++ b/
yaffs_guts.c
@@
-44,8
+44,8
@@
static int yaffs_wr_data_obj(struct yaffs_obj *in, int inode_chunk,
/* Function to calculate chunk and offset */
/* Function to calculate chunk and offset */
-
static inline
void yaffs_addr_to_chunk(struct yaffs_dev *dev, loff_t addr,
-
int *chunk_out, u32 *offset_out)
+void yaffs_addr_to_chunk(struct yaffs_dev *dev, loff_t addr,
+ int *chunk_out, u32 *offset_out)
{
int chunk;
u32 offset;
{
int chunk;
u32 offset;
@@
-280,7
+280,8
@@
static void yaffs_handle_chunk_wr_error(struct yaffs_dev *dev, int nand_chunk,
static inline int yaffs_hash_fn(int n)
{
static inline int yaffs_hash_fn(int n)
{
- n = abs(n);
+ if(n < 0)
+ n = -n;
return n % YAFFS_NOBJECT_BUCKETS;
}
return n % YAFFS_NOBJECT_BUCKETS;
}
@@
-696,6
+697,11
@@
void yaffs_set_obj_name_from_oh(struct yaffs_obj *obj,
#endif
}
#endif
}
+loff_t yaffs_max_file_size(struct yaffs_dev *dev)
+{
+ return ((loff_t) YAFFS_MAX_CHUNK_ID) * dev->data_bytes_per_chunk;
+}
+
/*-------------------- TNODES -------------------
* List of spare tnodes
/*-------------------- TNODES -------------------
* List of spare tnodes
@@
-1953,7
+1959,8
@@
struct yaffs_obj *yaffs_new_obj(struct yaffs_dev *dev, int number,
case YAFFS_OBJECT_TYPE_FILE:
the_obj->variant.file_variant.file_size = 0;
the_obj->variant.file_variant.scanned_size = 0;
case YAFFS_OBJECT_TYPE_FILE:
the_obj->variant.file_variant.file_size = 0;
the_obj->variant.file_variant.scanned_size = 0;
- the_obj->variant.file_variant.shrink_size = ~0; /* max */
+ the_obj->variant.file_variant.shrink_size =
+ yaffs_max_file_size(dev);
the_obj->variant.file_variant.top_level = 0;
the_obj->variant.file_variant.top = tn;
break;
the_obj->variant.file_variant.top_level = 0;
the_obj->variant.file_variant.top = tn;
break;
@@
-3504,7
+3511,7
@@
int yaffs_file_rd(struct yaffs_obj *in, u8 * buffer, loff_t offset, int n_bytes)
}
int yaffs_do_file_wr(struct yaffs_obj *in, const u8 *buffer, loff_t offset,
}
int yaffs_do_file_wr(struct yaffs_obj *in, const u8 *buffer, loff_t offset,
- int n_bytes, int write_t
r
hrough)
+ int n_bytes, int write_through)
{
int chunk;
{
int chunk;
@@
-3513,10
+3520,10
@@
int yaffs_do_file_wr(struct yaffs_obj *in, const u8 *buffer, loff_t offset,
int n = n_bytes;
int n_done = 0;
int n_writeback;
int n = n_bytes;
int n_done = 0;
int n_writeback;
-
in
t start_write = offset;
+
loff_
t start_write = offset;
int chunk_written = 0;
u32 n_bytes_read;
int chunk_written = 0;
u32 n_bytes_read;
-
u32
chunk_start;
+
loff_t
chunk_start;
struct yaffs_dev *dev;
dev = in->my_dev;
struct yaffs_dev *dev;
dev = in->my_dev;
@@
-3524,11
+3531,11
@@
int yaffs_do_file_wr(struct yaffs_obj *in, const u8 *buffer, loff_t offset,
while (n > 0 && chunk_written >= 0) {
yaffs_addr_to_chunk(dev, offset, &chunk, &start);
while (n > 0 && chunk_written >= 0) {
yaffs_addr_to_chunk(dev, offset, &chunk, &start);
- if (
chunk
* dev->data_bytes_per_chunk + start != offset ||
+ if (
((loff_t)chunk)
* dev->data_bytes_per_chunk + start != offset ||
start >= dev->data_bytes_per_chunk) {
yaffs_trace(YAFFS_TRACE_ERROR,
start >= dev->data_bytes_per_chunk) {
yaffs_trace(YAFFS_TRACE_ERROR,
- "AddrToChunk of offset %d gives chunk %d start %d",
-
(int)
offset, chunk, start);
+ "AddrToChunk of offset %
ll
d gives chunk %d start %d",
+ offset, chunk, start);
}
chunk++; /* File pos to chunk in file offset */
}
chunk++; /* File pos to chunk in file offset */
@@
-3545,7
+3552,7
@@
int yaffs_do_file_wr(struct yaffs_obj *in, const u8 *buffer, loff_t offset,
* before.
*/
* before.
*/
- chunk_start = ((
chunk - 1
) * dev->data_bytes_per_chunk);
+ chunk_start = ((
(loff_t)(chunk - 1)
) * dev->data_bytes_per_chunk);
if (chunk_start > in->variant.file_variant.file_size)
n_bytes_read = 0; /* Past end of file */
if (chunk_start > in->variant.file_variant.file_size)
n_bytes_read = 0; /* Past end of file */
@@
-3613,7
+3620,7
@@
int yaffs_do_file_wr(struct yaffs_obj *in, const u8 *buffer, loff_t offset,
cache->locked = 0;
cache->n_bytes = n_writeback;
cache->locked = 0;
cache->n_bytes = n_writeback;
- if (write_t
r
hrough) {
+ if (write_through) {
chunk_written =
yaffs_wr_data_obj
(cache->object,
chunk_written =
yaffs_wr_data_obj
(cache->object,
@@
-3673,25
+3680,34
@@
int yaffs_do_file_wr(struct yaffs_obj *in, const u8 *buffer, loff_t offset,
}
int yaffs_wr_file(struct yaffs_obj *in, const u8 *buffer, loff_t offset,
}
int yaffs_wr_file(struct yaffs_obj *in, const u8 *buffer, loff_t offset,
- int n_bytes, int write_t
r
hrough)
+ int n_bytes, int write_through)
{
yaffs2_handle_hole(in, offset);
{
yaffs2_handle_hole(in, offset);
- return yaffs_do_file_wr(in, buffer, offset, n_bytes, write_t
r
hrough);
+ return yaffs_do_file_wr(in, buffer, offset, n_bytes, write_through);
}
/* ---------------------- File resizing stuff ------------------ */
}
/* ---------------------- File resizing stuff ------------------ */
-static void yaffs_prune_chunks(struct yaffs_obj *in,
in
t new_size)
+static void yaffs_prune_chunks(struct yaffs_obj *in,
loff_
t new_size)
{
struct yaffs_dev *dev = in->my_dev;
{
struct yaffs_dev *dev = in->my_dev;
-
in
t old_size = in->variant.file_variant.file_size;
+
loff_
t old_size = in->variant.file_variant.file_size;
int i;
int chunk_id;
int i;
int chunk_id;
-
int last_del = 1 + (old_size - 1) / dev->data_bytes_per_chunk
;
- int
start_del = 1 + (new_size + dev->data_bytes_per_chunk - 1) /
-
dev->data_bytes_per_chunk
;
+
u32 dummy
;
+ int
last_del;
+
int start_del
;
+ if(old_size > 0)
+ yaffs_addr_to_chunk(dev, old_size - 1, &last_del, &dummy);
+ else
+ last_del = 0;
+
+ yaffs_addr_to_chunk(dev, new_size + dev->data_bytes_per_chunk - 1,
+ &start_del, &dummy);
+ last_del++;
+ start_del++;
/* Delete backwards so that we don't end up with holes if
* power is lost part-way through the operation.
/* Delete backwards so that we don't end up with holes if
* power is lost part-way through the operation.
@@
-5001,7
+5017,13
@@
void yaffs_oh_size_load(struct yaffs_obj_hdr *oh, loff_t fsize)
loff_t yaffs_oh_to_size(struct yaffs_obj_hdr *oh)
{
loff_t yaffs_oh_to_size(struct yaffs_obj_hdr *oh)
{
- loff_t retval = (((loff_t) oh->file_size_high) << 32) |
+ loff_t retval;
+
+ if(~(oh->file_size_high))
+ retval = (((loff_t) oh->file_size_high) << 32) |
(((loff_t) oh->file_size_low) & 0xFFFFFFFF);
(((loff_t) oh->file_size_low) & 0xFFFFFFFF);
+ else
+ retval = (loff_t) oh->file_size_low;
+
return retval;
}
return retval;
}