Made implicity tag updates explicit

Before, tags were implicitly updated by the dir update functions, which
have a strong understanding of the entry struct. However, most of the
time the tag was already a part of the entry struct being committed.

By making tag updates explicit, this does add cost to commits that
now have to pass tag updates explicitly, but it reduces cost where that
tag and entry update can be combined into one commit region.

It also simplifies the dir update functions.
This commit is contained in:
Christopher Haster
2018-03-10 21:28:06 -06:00
parent 692f0c542e
commit ca3d6a52d2

63
lfs.c
View File

@@ -349,10 +349,11 @@ static void lfs_entry_fromle32(struct lfs_disk_entry *d) {
d->u.dir[1] = lfs_fromle32(d->u.dir[1]); d->u.dir[1] = lfs_fromle32(d->u.dir[1]);
} }
static void lfs_entry_tole32(struct lfs_disk_entry *d) { // TODO
d->u.dir[0] = lfs_tole32(d->u.dir[0]); //static void lfs_entry_tole32(struct lfs_disk_entry *d) {
d->u.dir[1] = lfs_tole32(d->u.dir[1]); // d->u.dir[0] = lfs_tole32(d->u.dir[0]);
} // d->u.dir[1] = lfs_tole32(d->u.dir[1]);
//}
static void lfs_superblock_fromle32(struct lfs_disk_superblock *d) { static void lfs_superblock_fromle32(struct lfs_disk_superblock *d) {
d->root[0] = lfs_fromle32(d->root[0]); d->root[0] = lfs_fromle32(d->root[0]);
@@ -670,13 +671,7 @@ static int lfs_dir_append(lfs_t *lfs, lfs_dir_t *dir,
r->off += entry->off; r->off += entry->off;
} }
lfs_entry_tole32(&entry->d); return lfs_dir_commit(lfs, dir, regions);
int err = lfs_dir_commit(lfs, dir,
&(struct lfs_region){
LFS_FROM_MEM, entry->off, +4,
{.m.data = &entry->d}, 4, regions});
lfs_entry_fromle32(&entry->d);
return err;
} }
// we need to allocate a new dir block // we need to allocate a new dir block
@@ -694,12 +689,7 @@ static int lfs_dir_append(lfs_t *lfs, lfs_dir_t *dir,
r->off += entry->off; r->off += entry->off;
} }
lfs_entry_tole32(&entry->d); err = lfs_dir_commit(lfs, dir, regions);
err = lfs_dir_commit(lfs, dir,
&(struct lfs_region){
LFS_FROM_MEM, entry->off, +4,
{.m.data = &entry->d}, 4, regions});
lfs_entry_fromle32(&entry->d);
if (err) { if (err) {
return err; return err;
} }
@@ -735,12 +725,7 @@ static int lfs_dir_update(lfs_t *lfs, lfs_dir_t *dir,
r->off += entry->off; r->off += entry->off;
} }
lfs_entry_tole32(&entry->d); int err = lfs_dir_commit(lfs, dir, regions);
int err = lfs_dir_commit(lfs, dir,
&(struct lfs_region){
LFS_FROM_MEM, entry->off, 0,
{.m.data = &entry->d}, sizeof(entry->d), regions});
lfs_entry_fromle32(&entry->d);
if (err) { if (err) {
return err; return err;
} }
@@ -1051,8 +1036,8 @@ int lfs_mkdir(lfs_t *lfs, const char *path) {
err = lfs_dir_append(lfs, &cwd, &entry, err = lfs_dir_append(lfs, &cwd, &entry,
&(struct lfs_region){ &(struct lfs_region){
LFS_FROM_MEM, 0, +(sizeof(entry.d)-4), LFS_FROM_MEM, 0, +sizeof(entry.d),
{.m.data = (uint8_t*)&entry.d+4}, sizeof(entry.d)-4, {.m.data = &entry.d}, sizeof(entry.d),
&(struct lfs_region){ &(struct lfs_region){
LFS_FROM_MEM, 0, +entry.d.nlen, LFS_FROM_MEM, 0, +entry.d.nlen,
{.m.data = path}, entry.d.nlen}}); {.m.data = path}, entry.d.nlen}});
@@ -1441,8 +1426,8 @@ int lfs_file_open(lfs_t *lfs, lfs_file_t *file,
entry.d.u.file.size = 0; entry.d.u.file.size = 0;
err = lfs_dir_append(lfs, &cwd, &entry, err = lfs_dir_append(lfs, &cwd, &entry,
&(struct lfs_region){ &(struct lfs_region){
LFS_FROM_MEM, 0, +(sizeof(entry.d)-4), LFS_FROM_MEM, 0, +sizeof(entry.d),
{.m.data = (uint8_t*)&entry.d+4}, sizeof(entry.d)-4, {.m.data = &entry.d}, sizeof(entry.d),
&(struct lfs_region){ &(struct lfs_region){
LFS_FROM_MEM, 0, +entry.d.nlen, LFS_FROM_MEM, 0, +entry.d.nlen,
{.m.data = path}, entry.d.nlen}}); {.m.data = path}, entry.d.nlen}});
@@ -1664,7 +1649,7 @@ int lfs_file_sync(lfs_t *lfs, lfs_file_t *file) {
err = lfs_dir_update(lfs, &cwd, &entry, err = lfs_dir_update(lfs, &cwd, &entry,
&(struct lfs_region){ &(struct lfs_region){
LFS_FROM_MEM, 0, 0, LFS_FROM_MEM, 0, 0,
{.m.data = (const uint8_t *)&entry.d+4}, sizeof(entry.d)-4}); {.m.data = &entry.d}, sizeof(entry.d)});
if (err) { if (err) {
return err; return err;
} }
@@ -2086,7 +2071,10 @@ int lfs_rename(lfs_t *lfs, const char *oldpath, const char *newpath) {
// mark as moving // mark as moving
oldentry.d.type |= LFS_STRUCT_MOVED; oldentry.d.type |= LFS_STRUCT_MOVED;
err = lfs_dir_update(lfs, &oldcwd, &oldentry, NULL); err = lfs_dir_update(lfs, &oldcwd, &oldentry,
&(struct lfs_region){
LFS_FROM_MEM, 0, 0,
{.m.data = &oldentry.d}, sizeof(oldentry.d)});
if (err) { if (err) {
return err; return err;
} }
@@ -2106,10 +2094,9 @@ int lfs_rename(lfs_t *lfs, const char *oldpath, const char *newpath) {
err = lfs_dir_update(lfs, &newcwd, &newentry, err = lfs_dir_update(lfs, &newcwd, &newentry,
&(struct lfs_region){ &(struct lfs_region){
LFS_FROM_MEM, 0, 0, LFS_FROM_MEM, 0, 0,
{.m.data = (const uint8_t*)&newentry.d+4}, {.m.data = &newentry.d}, sizeof(newentry.d),
sizeof(newentry.d)-4,
&(struct lfs_region){ &(struct lfs_region){
LFS_FROM_MEM, sizeof(newentry.d)-4, 0, LFS_FROM_MEM, sizeof(newentry.d), 0,
{.m.data = newpath}, newentry.d.nlen}}); {.m.data = newpath}, newentry.d.nlen}});
if (err) { if (err) {
return err; return err;
@@ -2117,9 +2104,8 @@ int lfs_rename(lfs_t *lfs, const char *oldpath, const char *newpath) {
} else { } else {
err = lfs_dir_append(lfs, &newcwd, &newentry, err = lfs_dir_append(lfs, &newcwd, &newentry,
&(struct lfs_region){ &(struct lfs_region){
LFS_FROM_MEM, 0, +(sizeof(newentry.d)-4), LFS_FROM_MEM, 0, +sizeof(newentry.d),
{.m.data = (const uint8_t*)&newentry.d+4}, {.m.data = &newentry.d}, sizeof(newentry.d),
sizeof(newentry.d)-4,
&(struct lfs_region){ &(struct lfs_region){
LFS_FROM_MEM, 0, +newentry.d.nlen, LFS_FROM_MEM, 0, +newentry.d.nlen,
{.m.data = newpath}, newentry.d.nlen}}); {.m.data = newpath}, newentry.d.nlen}});
@@ -2557,7 +2543,7 @@ static int lfs_relocate(lfs_t *lfs,
int err = lfs_dir_update(lfs, &parent, &entry, int err = lfs_dir_update(lfs, &parent, &entry,
&(struct lfs_region){ &(struct lfs_region){
LFS_FROM_MEM, 0, 0, LFS_FROM_MEM, 0, 0,
{.m.data = (const uint8_t*)&entry.d+4}, sizeof(entry.d)-4}); {.m.data = &entry.d}, sizeof(entry.d)});
if (err) { if (err) {
return err; return err;
} }
@@ -2681,7 +2667,10 @@ int lfs_deorphan(lfs_t *lfs) {
LFS_DEBUG("Found partial move %d %d", LFS_DEBUG("Found partial move %d %d",
entry.d.u.dir[0], entry.d.u.dir[1]); entry.d.u.dir[0], entry.d.u.dir[1]);
entry.d.type &= ~LFS_STRUCT_MOVED; entry.d.type &= ~LFS_STRUCT_MOVED;
err = lfs_dir_update(lfs, &cwd, &entry, NULL); err = lfs_dir_update(lfs, &cwd, &entry,
&(struct lfs_region){
LFS_FROM_MEM, 0, 0,
{.m.data = &entry.d}, sizeof(entry.d)});
if (err) { if (err) {
return err; return err;
} }