Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Feature for adding uncommitted close to withdraw previous writes #960

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
28 changes: 28 additions & 0 deletions lfs.c
Original file line number Diff line number Diff line change
Expand Up @@ -581,6 +581,7 @@ static lfs_ssize_t lfs_file_flushedread(lfs_t *lfs, lfs_file_t *file,
static lfs_ssize_t lfs_file_read_(lfs_t *lfs, lfs_file_t *file,
void *buffer, lfs_size_t size);
static int lfs_file_close_(lfs_t *lfs, lfs_file_t *file);
static int lfs_file_uncommitted_close_(lfs_t *lfs, lfs_file_t *file);
static lfs_soff_t lfs_file_size_(lfs_t *lfs, lfs_file_t *file);

static lfs_ssize_t lfs_fs_size_(lfs_t *lfs);
Expand Down Expand Up @@ -3222,6 +3223,18 @@ static int lfs_file_close_(lfs_t *lfs, lfs_file_t *file) {
return err;
}

static int lfs_file_uncommitted_close_(lfs_t *lfs, lfs_file_t *file) {
// remove from list of mdirs
lfs_mlist_remove(lfs, (struct lfs_mlist*)file);

// clean up memory
if (!file->cfg->buffer) {
lfs_free(file->cache.buffer);
}

return 0;
}


#ifndef LFS_READONLY
static int lfs_file_relocate(lfs_t *lfs, lfs_file_t *file) {
Expand Down Expand Up @@ -6098,6 +6111,21 @@ int lfs_file_close(lfs_t *lfs, lfs_file_t *file) {
return err;
}

int lfs_file_uncommitted_close(lfs_t *lfs, lfs_file_t *file) {
int err = LFS_LOCK(lfs->cfg);
if (err) {
return err;
}
LFS_TRACE("lfs_file_uncommitted_close(%p, %p)", (void*)lfs, (void*)file);
LFS_ASSERT(lfs_mlist_isopen(lfs->mlist, (struct lfs_mlist*)file));

err = lfs_file_uncommitted_close_(lfs, file);

LFS_TRACE("lfs_file_uncommitted_close -> %d", err);
LFS_UNLOCK(lfs->cfg);
return err;
}

#ifndef LFS_READONLY
int lfs_file_sync(lfs_t *lfs, lfs_file_t *file) {
int err = LFS_LOCK(lfs->cfg);
Expand Down
9 changes: 9 additions & 0 deletions lfs.h
Original file line number Diff line number Diff line change
Expand Up @@ -598,6 +598,15 @@ int lfs_file_opencfg(lfs_t *lfs, lfs_file_t *file,
// Returns a negative error code on failure.
int lfs_file_close(lfs_t *lfs, lfs_file_t *file);

// Close a file
//
// Any pending writes are withdrawn.
// If desired a previous sync call is necesarry to write pending writes out to the storage.
// Releases any allocated resources.
//
// Returns a negative error code on failure.
int lfs_file_uncommitted_close(lfs_t *lfs, lfs_file_t *file);

// Synchronize a file on storage
//
// Any pending writes are written out to storage.
Expand Down
Loading