mirror of
https://github.com/Rockbox/rockbox.git
synced 2025-12-11 14:15:15 -05:00
Ooops. Forgot to clear the newly allocated cluster in mkdir()
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@4242 a1c6a512-1295-4272-9138-f99709370657
This commit is contained in:
parent
54353e04b1
commit
7c75386a83
1 changed files with 21 additions and 4 deletions
|
|
@ -238,6 +238,7 @@ static int bpb_is_sane(void);
|
||||||
static void *cache_fat_sector(int secnum);
|
static void *cache_fat_sector(int secnum);
|
||||||
static int create_dos_name(unsigned char *name, unsigned char *newname);
|
static int create_dos_name(unsigned char *name, unsigned char *newname);
|
||||||
static unsigned int find_free_cluster(unsigned int start);
|
static unsigned int find_free_cluster(unsigned int start);
|
||||||
|
static int transfer( unsigned int start, int count, char* buf, bool write );
|
||||||
|
|
||||||
#define FAT_CACHE_SIZE 0x20
|
#define FAT_CACHE_SIZE 0x20
|
||||||
#define FAT_CACHE_MASK (FAT_CACHE_SIZE-1)
|
#define FAT_CACHE_MASK (FAT_CACHE_SIZE-1)
|
||||||
|
|
@ -1334,6 +1335,9 @@ int fat_create_dir(char* name,
|
||||||
struct fat_dir* newdir,
|
struct fat_dir* newdir,
|
||||||
struct fat_dir* dir)
|
struct fat_dir* dir)
|
||||||
{
|
{
|
||||||
|
unsigned char buf[SECTOR_SIZE];
|
||||||
|
int i;
|
||||||
|
int sector;
|
||||||
int rc;
|
int rc;
|
||||||
struct fat_file dummyfile;
|
struct fat_file dummyfile;
|
||||||
|
|
||||||
|
|
@ -1347,20 +1351,33 @@ int fat_create_dir(char* name,
|
||||||
if (rc < 0)
|
if (rc < 0)
|
||||||
return rc * 10 - 1;
|
return rc * 10 - 1;
|
||||||
|
|
||||||
/* Then add the "." entry */
|
/* Allocate a new cluster for the directory */
|
||||||
newdir->file.firstcluster = find_free_cluster(fat_bpb.fsinfo.nextfree);
|
newdir->file.firstcluster = find_free_cluster(fat_bpb.fsinfo.nextfree);
|
||||||
|
if(newdir->file.firstcluster == 0)
|
||||||
|
return -1;
|
||||||
|
|
||||||
update_fat_entry(newdir->file.firstcluster, FAT_EOF_MARK);
|
update_fat_entry(newdir->file.firstcluster, FAT_EOF_MARK);
|
||||||
|
|
||||||
rc = add_dir_entry(newdir, &dummyfile, ".", true, true);
|
/* Clear the entire cluster */
|
||||||
|
memset(buf, 0, sizeof buf);
|
||||||
|
sector = cluster2sec(newdir->file.firstcluster);
|
||||||
|
for(i = 0;i < (int)fat_bpb.bpb_secperclus;i++) {
|
||||||
|
rc = transfer( sector + fat_bpb.startsector + i, 1, buf, true );
|
||||||
if (rc < 0)
|
if (rc < 0)
|
||||||
return rc * 10 - 2;
|
return rc * 10 - 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Then add the "." entry */
|
||||||
|
rc = add_dir_entry(newdir, &dummyfile, ".", true, true);
|
||||||
|
if (rc < 0)
|
||||||
|
return rc * 10 - 3;
|
||||||
dummyfile.firstcluster = newdir->file.firstcluster;
|
dummyfile.firstcluster = newdir->file.firstcluster;
|
||||||
update_short_entry(&dummyfile, 0, FAT_ATTR_DIRECTORY);
|
update_short_entry(&dummyfile, 0, FAT_ATTR_DIRECTORY);
|
||||||
|
|
||||||
/* and the ".." entry */
|
/* and the ".." entry */
|
||||||
rc = add_dir_entry(newdir, &dummyfile, "..", true, true);
|
rc = add_dir_entry(newdir, &dummyfile, "..", true, true);
|
||||||
if (rc < 0)
|
if (rc < 0)
|
||||||
return rc * 10 - 3;
|
return rc * 10 - 4;
|
||||||
|
|
||||||
/* The root cluster is cluster 0 in the ".." entry */
|
/* The root cluster is cluster 0 in the ".." entry */
|
||||||
if(dir->file.firstcluster == fat_bpb.bpb_rootclus)
|
if(dir->file.firstcluster == fat_bpb.bpb_rootclus)
|
||||||
|
|
@ -1374,7 +1391,7 @@ int fat_create_dir(char* name,
|
||||||
|
|
||||||
rc = flush_fat();
|
rc = flush_fat();
|
||||||
if (rc < 0)
|
if (rc < 0)
|
||||||
return rc * 10 - 4;
|
return rc * 10 - 5;
|
||||||
|
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue