Skip to content

Commit

Permalink
update exfat from current head
Browse files Browse the repository at this point in the history
Change-Id: I7d93474296612fda1dde23f6e8690668d6880e27
  • Loading branch information
bigbiff authored and Dees-Troy committed Sep 5, 2014
1 parent 8dfa777 commit 2e33c5e
Show file tree
Hide file tree
Showing 36 changed files with 438 additions and 636 deletions.
10 changes: 5 additions & 5 deletions exfat/dump/main.c
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
Prints detailed information about exFAT volume.
Free exFAT implementation.
Copyright (C) 2011-2013 Andrew Nayenko
Copyright (C) 2011-2014 Andrew Nayenko
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
Expand Down Expand Up @@ -85,13 +85,13 @@ static int dump_sb(const char* spec)
if (exfat_read(dev, &sb, sizeof(struct exfat_super_block)) < 0)
{
exfat_close(dev);
exfat_error("failed to read from `%s'", spec);
exfat_error("failed to read from '%s'", spec);
return 1;
}
if (memcmp(sb.oem_name, "EXFAT ", sizeof(sb.oem_name)) != 0)
{
exfat_close(dev);
exfat_error("exFAT file system is not found on `%s'", spec);
exfat_error("exFAT file system is not found on '%s'", spec);
return 1;
}

Expand All @@ -106,7 +106,7 @@ static int dump_sb(const char* spec)

static void dump_sectors(struct exfat* ef)
{
off_t a = 0, b = 0;
off64_t a = 0, b = 0;

printf("Used sectors ");
while (exfat_find_used_sectors(ef, &a, &b) == 0)
Expand Down Expand Up @@ -167,7 +167,7 @@ int main(int argc, char* argv[])
used_sectors = true;
break;
case 'V':
puts("Copyright (C) 2011-2013 Andrew Nayenko");
puts("Copyright (C) 2011-2014 Andrew Nayenko");
return 0;
default:
usage(argv[0]);
Expand Down
55 changes: 43 additions & 12 deletions exfat/exfat-fuse/main.c
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
FUSE-based exFAT implementation. Requires FUSE 2.6 or later.
Free exFAT implementation.
Copyright (C) 2010-2013 Andrew Nayenko
Copyright (C) 2010-2014 Andrew Nayenko
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
Expand Down Expand Up @@ -83,6 +83,13 @@ static int fuse_exfat_truncate(const char* path, off64_t size)
return rc;

rc = exfat_truncate(&ef, node, size, true);
if (rc != 0)
{
exfat_flush_node(&ef, node); /* ignore return code */
exfat_put_node(&ef, node);
return rc;
}
rc = exfat_flush_node(&ef, node);
exfat_put_node(&ef, node);
return rc;
}
Expand All @@ -104,7 +111,7 @@ static int fuse_exfat_readdir(const char* path, void* buffer,
if (!(parent->flags & EXFAT_ATTRIB_DIR))
{
exfat_put_node(&ef, parent);
exfat_error("`%s' is not a directory (0x%x)", path, parent->flags);
exfat_error("'%s' is not a directory (0x%x)", path, parent->flags);
return -ENOTDIR;
}

Expand All @@ -115,7 +122,7 @@ static int fuse_exfat_readdir(const char* path, void* buffer,
if (rc != 0)
{
exfat_put_node(&ef, parent);
exfat_error("failed to open directory `%s'", path);
exfat_error("failed to open directory '%s'", path);
return rc;
}
while ((node = exfat_readdir(&ef, &it)))
Expand Down Expand Up @@ -149,9 +156,28 @@ static int fuse_exfat_open(const char* path, struct fuse_file_info* fi)

static int fuse_exfat_release(const char* path, struct fuse_file_info* fi)
{
/*
This handler is called by FUSE on close() syscall. If the FUSE
implementation does not call flush handler, we will flush node here.
But in this case we will not be able to return an error to the caller.
See fuse_exfat_flush() below.
*/
exfat_debug("[%s] %s", __func__, path);
exfat_flush_node(&ef, get_node(fi));
exfat_put_node(&ef, get_node(fi));
return 0;
return 0; /* FUSE ignores this return value */
}

static int fuse_exfat_flush(const char* path, struct fuse_file_info* fi)
{
/*
This handler may be called by FUSE on close() syscall. FUSE also deals
with removals of open files, so we don't free clusters on close but
only on rmdir and unlink. If the FUSE implementation does not call this
handler we will flush node on release. See fuse_exfat_relase() above.
*/
exfat_debug("[%s] %s", __func__, path);
return exfat_flush_node(&ef, get_node(fi));
}

static int fuse_exfat_fsync(const char* path, int datasync,
Expand All @@ -160,9 +186,6 @@ static int fuse_exfat_fsync(const char* path, int datasync,
int rc;

exfat_debug("[%s] %s", __func__, path);
rc = exfat_flush_node(&ef, get_node(fi));
if (rc != 0)
return rc;
rc = exfat_flush(&ef);
if (rc != 0)
return rc;
Expand Down Expand Up @@ -206,7 +229,9 @@ static int fuse_exfat_unlink(const char* path)

rc = exfat_unlink(&ef, node);
exfat_put_node(&ef, node);
return rc;
if (rc != 0)
return rc;
return exfat_cleanup_node(&ef, node);
}

static int fuse_exfat_rmdir(const char* path)
Expand All @@ -222,7 +247,9 @@ static int fuse_exfat_rmdir(const char* path)

rc = exfat_rmdir(&ef, node);
exfat_put_node(&ef, node);
return rc;
if (rc != 0)
return rc;
return exfat_cleanup_node(&ef, node);
}

static int fuse_exfat_mknod(const char* path, mode_t mode, dev_t dev)
Expand Down Expand Up @@ -255,8 +282,9 @@ static int fuse_exfat_utimens(const char* path, const struct timespec tv[2])
return rc;

exfat_utimes(node, tv);
rc = exfat_flush_node(&ef, node);
exfat_put_node(&ef, node);
return 0;
return rc;
}

static int fuse_exfat_chmod(const char* path, mode_t mode)
Expand Down Expand Up @@ -295,7 +323,7 @@ static int fuse_exfat_statfs(const char* path, struct statvfs* sfs)
b) no such thing as inode;
So here we assume that inode = cluster.
*/
sfs->f_files = (sfs->f_blocks - sfs->f_bfree) >> ef.sb->spc_bits;
sfs->f_files = le32_to_cpu(ef.sb->cluster_count);
sfs->f_favail = sfs->f_bfree >> ef.sb->spc_bits;
sfs->f_ffree = sfs->f_bavail;

Expand Down Expand Up @@ -330,6 +358,7 @@ static struct fuse_operations fuse_exfat_ops =
.readdir = fuse_exfat_readdir,
.open = fuse_exfat_open,
.release = fuse_exfat_release,
.flush = fuse_exfat_flush,
.fsync = fuse_exfat_fsync,
.fsyncdir = fuse_exfat_fsync,
.read = fuse_exfat_read,
Expand All @@ -350,6 +379,7 @@ static struct fuse_operations fuse_exfat_ops =
static char* add_option(char* options, const char* name, const char* value)
{
size_t size;
char* optionsf = options;

if (value)
size = strlen(options) + strlen(name) + strlen(value) + 3;
Expand All @@ -359,6 +389,7 @@ static char* add_option(char* options, const char* name, const char* value)
options = realloc(options, size);
if (options == NULL)
{
free(optionsf);
exfat_error("failed to reallocate options string");
return NULL;
}
Expand Down Expand Up @@ -454,7 +485,7 @@ int main(int argc, char* argv[])
break;
case 'V':
free(mount_options);
puts("Copyright (C) 2010-2013 Andrew Nayenko");
puts("Copyright (C) 2010-2014 Andrew Nayenko");
return 0;
case 'v':
break;
Expand Down
17 changes: 10 additions & 7 deletions exfat/fsck/main.c
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
exFAT file system checker.
Free exFAT implementation.
Copyright (C) 2011-2013 Andrew Nayenko
Copyright (C) 2011-2014 Andrew Nayenko
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
Expand Down Expand Up @@ -45,7 +45,7 @@ static int nodeck(struct exfat* ef, struct exfat_node* node)
char name[UTF8_BYTES(EXFAT_NAME_MAX) + 1];

exfat_get_name(node, name, sizeof(name) - 1);
exfat_error("file `%s' has invalid cluster 0x%x", name, c);
exfat_error("file '%s' has invalid cluster 0x%x", name, c);
rc = 1;
break;
}
Expand All @@ -54,7 +54,7 @@ static int nodeck(struct exfat* ef, struct exfat_node* node)
char name[UTF8_BYTES(EXFAT_NAME_MAX) + 1];

exfat_get_name(node, name, sizeof(name) - 1);
exfat_error("cluster 0x%x of file `%s' is not allocated", c, name);
exfat_error("cluster 0x%x of file '%s' is not allocated", c, name);
rc = 1;
}
c = exfat_next_cluster(ef, node, c);
Expand All @@ -72,16 +72,20 @@ static void dirck(struct exfat* ef, const char* path)
char* entry_path;

if (exfat_lookup(ef, &parent, path) != 0)
exfat_bug("directory `%s' is not found", path);
exfat_bug("directory '%s' is not found", path);
if (!(parent->flags & EXFAT_ATTRIB_DIR))
exfat_bug("`%s' is not a directory (0x%x)", path, parent->flags);
exfat_bug("'%s' is not a directory (0x%x)", path, parent->flags);
if (nodeck(ef, parent) != 0)
{
exfat_put_node(ef, parent);
return;
}

path_length = strlen(path);
entry_path = malloc(path_length + 1 + UTF8_BYTES(EXFAT_NAME_MAX) + 1);
if (entry_path == NULL)
{
exfat_put_node(ef, parent);
exfat_error("out of memory");
return;
}
Expand All @@ -93,7 +97,6 @@ static void dirck(struct exfat* ef, const char* path)
{
free(entry_path);
exfat_put_node(ef, parent);
exfat_error("failed to open directory `%s'", path);
return;
}
while ((node = exfat_readdir(ef, &it)))
Expand Down Expand Up @@ -146,7 +149,7 @@ int main(int argc, char* argv[])
switch (opt)
{
case 'V':
puts("Copyright (C) 2011-2013 Andrew Nayenko");
puts("Copyright (C) 2011-2014 Andrew Nayenko");
return 0;
default:
usage(argv[0]);
Expand Down
4 changes: 2 additions & 2 deletions exfat/label/main.c
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
Prints or changes exFAT volume label.
Free exFAT implementation.
Copyright (C) 2011-2013 Andrew Nayenko
Copyright (C) 2011-2014 Andrew Nayenko
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
Expand Down Expand Up @@ -35,7 +35,7 @@ int main(int argc, char* argv[])
{
printf("exfatlabel %u.%u.%u\n", EXFAT_VERSION_MAJOR,
EXFAT_VERSION_MINOR, EXFAT_VERSION_PATCH);
puts("Copyright (C) 2011-2013 Andrew Nayenko");
puts("Copyright (C) 2011-2014 Andrew Nayenko");
return 0;
}

Expand Down
Loading

0 comments on commit 2e33c5e

Please sign in to comment.