Alien-Libjio
view release on metacpan or search on metacpan
libjio/libjio/trans.c view on Meta::CPAN
* for us */
jclose(fs);
return NULL;
}
/* Sync a file */
int jsync(struct jfs *fs)
{
int rv;
struct jlinger *ltmp;
if (fs->fd < 0)
return -1;
rv = fdatasync(fs->fd);
if (rv != 0)
return rv;
/* note the jops will be in order, so if we crash or fail in the
* middle of this, there will be no problem applying the remaining
* transactions */
pthread_mutex_lock(&(fs->ltlock));
while (fs->ltrans != NULL) {
fiu_exit_on("jio/jsync/pre_unlink");
if (journal_free(fs->ltrans->jop, 1) != 0) {
pthread_mutex_unlock(&(fs->ltlock));
return -1;
}
ltmp = fs->ltrans->next;
free(fs->ltrans);
fs->ltrans = ltmp;
}
fs->ltrans_len = 0;
pthread_mutex_unlock(&(fs->ltlock));
return 0;
}
/* Change the location of the journal directory */
int jmove_journal(struct jfs *fs, const char *newpath)
{
int ret;
char *oldpath, jlockfile[PATH_MAX], oldjlockfile[PATH_MAX];
/* we try to be sure that all lingering transactions have been
* applied, so when we try to remove the journal directory, only the
* lockfile is there; however, we do this just to be nice, the caller
* must be sure there are no in-flight transactions or any other kind
* of operation around when he calls this function */
jsync(fs);
oldpath = fs->jdir;
snprintf(oldjlockfile, PATH_MAX, "%s/lock", fs->jdir);
fs->jdir = (char *) malloc(strlen(newpath) + 1);
if (fs->jdir == NULL)
return -1;
strcpy(fs->jdir, newpath);
ret = rename(oldpath, newpath);
if (ret == -1 && (errno == ENOTEMPTY || errno == EEXIST) ) {
/* rename() failed, the dest. directory is not empty, so we
* have to reload everything */
close(fs->jdirfd);
fs->jdirfd = open(newpath, O_RDONLY);
if (fs->jdirfd < 0)
goto exit;
snprintf(jlockfile, PATH_MAX, "%s/lock", newpath);
ret = rename(oldjlockfile, jlockfile);
if (ret < 0)
goto exit;
/* remove the journal directory, if possible */
unlink(oldjlockfile);
ret = rmdir(oldpath);
if (ret == -1) {
/* we couldn't remove it, something went wrong
* (possibly it had some files left) */
goto exit;
}
ret = 0;
}
exit:
free(oldpath);
return ret;
}
/* Close a file opened with jopen() */
int jclose(struct jfs *fs)
{
int ret;
ret = 0;
if (jfs_autosync_stop(fs))
ret = -1;
if (! (fs->flags & J_RDONLY)) {
if (jsync(fs))
ret = -1;
if (fs->jfd < 0 || close(fs->jfd))
ret = -1;
if (fs->jdirfd < 0 || close(fs->jdirfd))
ret = -1;
if (fs->jmap != MAP_FAILED)
munmap(fs->jmap, sizeof(unsigned int));
}
if (fs->fd < 0 || close(fs->fd))
ret = -1;
if (fs->name)
/* allocated by strdup() in jopen() */
free(fs->name);
if (fs->jdir)
free(fs->jdir);
pthread_mutex_destroy(&(fs->lock));
free(fs);
return ret;
}
( run in 0.547 second using v1.01-cache-2.11-cpan-2398b32b56e )