diff mbox

[U-Boot,v2,8/8] FAT: Make it possible to read from any file position

Message ID 1285759492.332736.1342790529256.JavaMail.root@advansee.com
State Superseded
Delegated to: Tom Rini
Headers show

Commit Message

Benoît Thébaudeau July 20, 2012, 1:22 p.m. UTC
When storage devices contain files larger than the embedded RAM, it is useful to
be able to read these files by chunks, e.g. for a software update to the
embedded NAND Flash from an external storage device (USB stick, SD card, etc.).

Hence, this patch makes it possible by adding a new FAT API to read files from a
given position.

Signed-off-by: Benoît Thébaudeau <benoit.thebaudeau@advansee.com>
Cc: Wolfgang Denk <wd@denx.de>
---
Changes for v2:
 - Patch renumbering because of the new v2 1/8.
 - Possible code style changes due to the new v2 1/8.
 - Add missing vairable renaming to fat_write.c.

 .../fs/fat/fat.c                                   |   88 ++++++++++++++++----
 .../fs/fat/fat_write.c                             |   18 ++--
 2 files changed, 80 insertions(+), 26 deletions(-)

Comments

Wolfgang Denk Sept. 2, 2012, 3:28 p.m. UTC | #1
Dear Benoît Thébaudeau,

In message <1285759492.332736.1342790529256.JavaMail.root@advansee.com> you wrote:
> When storage devices contain files larger than the embedded RAM, it is usef> ul to
> be able to read these files by chunks, e.g. for a software update to the
> embedded NAND Flash from an external storage device (USB stick, SD card, et> c.).
>
> Hence, this patch makes it possible by adding a new FAT API to read files f> rom a
> given position.
>
> Signed-off-by: Benoît Thébaudeau <benoit.thebaudeau@advansee.com>
> Cc: Wolfgang Denk <wd@denx.de>
> ---
> Changes for v2:
>  - Patch renumbering because of the new v2 1/8.
>  - Possible code style changes due to the new v2 1/8.
>  - Add missing vairable renaming to fat_write.c.
>
>  .../fs/fat/fat.c                                   |   88 ++++++++++++++++> ----
>  .../fs/fat/fat_write.c                             |   18 ++--
>  2 files changed, 80 insertions(+), 26 deletions(-)

I don't see any command line interface to actually use this code.

How would I put this to use?


Skipped for now.

Best regards,

Wolfgang Denk
Benoît Thébaudeau Sept. 3, 2012, 2:17 p.m. UTC | #2
Dear Wolfgang Denk,

On Sunday, September 2, 2012 5:28:09 PM, Wolfgang Denk wrote:
> Dear Benoît Thébaudeau,
> 
> In message
> <1285759492.332736.1342790529256.JavaMail.root@advansee.com> you
> wrote:
> > When storage devices contain files larger than the embedded RAM, it
> > is usef> ul to
> > be able to read these files by chunks, e.g. for a software update
> > to the
> > embedded NAND Flash from an external storage device (USB stick, SD
> > card, et> c.).
> >
> > Hence, this patch makes it possible by adding a new FAT API to read
> > files f> rom a
> > given position.
> >
> > Signed-off-by: Benoît Thébaudeau <benoit.thebaudeau@advansee.com>
> > Cc: Wolfgang Denk <wd@denx.de>
> > ---
> > Changes for v2:
> >  - Patch renumbering because of the new v2 1/8.
> >  - Possible code style changes due to the new v2 1/8.
> >  - Add missing vairable renaming to fat_write.c.
> >
> >  .../fs/fat/fat.c                                   |   88
> >  ++++++++++++++++> ----
> >  .../fs/fat/fat_write.c                             |   18 ++--
> >  2 files changed, 80 insertions(+), 26 deletions(-)
> 
> I don't see any command line interface to actually use this code.
> 
> How would I put this to use?

Here is the current "fatload" command line interface:
fatload <interface> <dev[:part]>  <addr> <filename> [bytes]

Do you prefer to change it to:
fatload <interface> <dev[:part]>  <addr> <filename> [offset] [bytes]

or to have a new dedicated command, or something else?

Best regards,
Benoît
Tom Rini Sept. 14, 2012, 8:49 p.m. UTC | #3
On Mon, Sep 03, 2012 at 04:17:09PM +0200, Beno??t Th??baudeau wrote:
> Dear Wolfgang Denk,
> 
> On Sunday, September 2, 2012 5:28:09 PM, Wolfgang Denk wrote:
> > Dear Beno??t Th??baudeau,
> > 
> > In message
> > <1285759492.332736.1342790529256.JavaMail.root@advansee.com> you
> > wrote:
> > > When storage devices contain files larger than the embedded RAM, it
> > > is usef> ul to
> > > be able to read these files by chunks, e.g. for a software update
> > > to the
> > > embedded NAND Flash from an external storage device (USB stick, SD
> > > card, et> c.).
> > >
> > > Hence, this patch makes it possible by adding a new FAT API to read
> > > files f> rom a
> > > given position.
> > >
> > > Signed-off-by: Beno??t Th??baudeau <benoit.thebaudeau@advansee.com>
> > > Cc: Wolfgang Denk <wd@denx.de>
> > > ---
> > > Changes for v2:
> > >  - Patch renumbering because of the new v2 1/8.
> > >  - Possible code style changes due to the new v2 1/8.
> > >  - Add missing vairable renaming to fat_write.c.
> > >
> > >  .../fs/fat/fat.c                                   |   88
> > >  ++++++++++++++++> ----
> > >  .../fs/fat/fat_write.c                             |   18 ++--
> > >  2 files changed, 80 insertions(+), 26 deletions(-)
> > 
> > I don't see any command line interface to actually use this code.
> > 
> > How would I put this to use?
> 
> Here is the current "fatload" command line interface:
> fatload <interface> <dev[:part]>  <addr> <filename> [bytes]
> 
> Do you prefer to change it to:
> fatload <interface> <dev[:part]>  <addr> <filename> [offset] [bytes]
> 
> or to have a new dedicated command, or something else?

Lets go with:
fatload <interface> <dev[:part]>  <addr> <filename> [bytes] [offset] and
update the long help text to mention both bytes and offset and that
offset requires bytes.
Tom Rini Sept. 14, 2012, 10:02 p.m. UTC | #4
On 09/14/2012 03:03 PM, Benoît Thébaudeau wrote:
> On Friday, September 14, 2012 10:49:04 PM, Tom Rini wrote:
>> On Mon, Sep 03, 2012 at 04:17:09PM +0200, Beno??t Th??baudeau wrote:
>>> Dear Wolfgang Denk,
>>>
>>> On Sunday, September 2, 2012 5:28:09 PM, Wolfgang Denk wrote:
>>>> Dear Beno??t Th??baudeau,
>>>>
>>>> In message
>>>> <1285759492.332736.1342790529256.JavaMail.root@advansee.com> you
>>>> wrote:
>>>>> When storage devices contain files larger than the embedded
>>>>> RAM, it
>>>>> is usef> ul to
>>>>> be able to read these files by chunks, e.g. for a software
>>>>> update
>>>>> to the
>>>>> embedded NAND Flash from an external storage device (USB stick,
>>>>> SD
>>>>> card, et> c.).
>>>>>
>>>>> Hence, this patch makes it possible by adding a new FAT API to
>>>>> read
>>>>> files f> rom a
>>>>> given position.
>>>>>
>>>>> Signed-off-by: Beno??t Th??baudeau
>>>>> <benoit.thebaudeau@advansee.com>
>>>>> Cc: Wolfgang Denk <wd@denx.de>
>>>>> ---
>>>>> Changes for v2:
>>>>>  - Patch renumbering because of the new v2 1/8.
>>>>>  - Possible code style changes due to the new v2 1/8.
>>>>>  - Add missing vairable renaming to fat_write.c.
>>>>>
>>>>>  .../fs/fat/fat.c                                   |   88
>>>>>  ++++++++++++++++> ----
>>>>>  .../fs/fat/fat_write.c                             |   18 ++--
>>>>>  2 files changed, 80 insertions(+), 26 deletions(-)
>>>>
>>>> I don't see any command line interface to actually use this code.
>>>>
>>>> How would I put this to use?
>>>
>>> Here is the current "fatload" command line interface:
>>> fatload <interface> <dev[:part]>  <addr> <filename> [bytes]
>>>
>>> Do you prefer to change it to:
>>> fatload <interface> <dev[:part]>  <addr> <filename> [offset]
>>> [bytes]
>>>
>>> or to have a new dedicated command, or something else?
>>
>> Lets go with:
>> fatload <interface> <dev[:part]>  <addr> <filename> [bytes] [offset]
>> and
>> update the long help text to mention both bytes and offset and that
>> offset requires bytes.
> 
> OK. Do you want that in an update of this patch or in a separate patch?

New patch to replace this.

> You're right: Having [bytes] before [offset] will avoid breaking the current
> users of this command. However, this has one drawback: fatls first has to be
> used to get the file size (with [offset] first, 0 could be easily used for
> offset to access [bytes]). Hence, still with [bytes] first, would you like to
> have some special bytes value (let's say -1 or any negative value) meaning "from
> offset to end of file"?

Lets go with -1 meaning until end of file since we don't have a good way
today to determine total filesize.
Benoît Thébaudeau Sept. 14, 2012, 10:03 p.m. UTC | #5
On Friday, September 14, 2012 10:49:04 PM, Tom Rini wrote:
> On Mon, Sep 03, 2012 at 04:17:09PM +0200, Beno??t Th??baudeau wrote:
> > Dear Wolfgang Denk,
> > 
> > On Sunday, September 2, 2012 5:28:09 PM, Wolfgang Denk wrote:
> > > Dear Beno??t Th??baudeau,
> > > 
> > > In message
> > > <1285759492.332736.1342790529256.JavaMail.root@advansee.com> you
> > > wrote:
> > > > When storage devices contain files larger than the embedded
> > > > RAM, it
> > > > is usef> ul to
> > > > be able to read these files by chunks, e.g. for a software
> > > > update
> > > > to the
> > > > embedded NAND Flash from an external storage device (USB stick,
> > > > SD
> > > > card, et> c.).
> > > >
> > > > Hence, this patch makes it possible by adding a new FAT API to
> > > > read
> > > > files f> rom a
> > > > given position.
> > > >
> > > > Signed-off-by: Beno??t Th??baudeau
> > > > <benoit.thebaudeau@advansee.com>
> > > > Cc: Wolfgang Denk <wd@denx.de>
> > > > ---
> > > > Changes for v2:
> > > >  - Patch renumbering because of the new v2 1/8.
> > > >  - Possible code style changes due to the new v2 1/8.
> > > >  - Add missing vairable renaming to fat_write.c.
> > > >
> > > >  .../fs/fat/fat.c                                   |   88
> > > >  ++++++++++++++++> ----
> > > >  .../fs/fat/fat_write.c                             |   18 ++--
> > > >  2 files changed, 80 insertions(+), 26 deletions(-)
> > > 
> > > I don't see any command line interface to actually use this code.
> > > 
> > > How would I put this to use?
> > 
> > Here is the current "fatload" command line interface:
> > fatload <interface> <dev[:part]>  <addr> <filename> [bytes]
> > 
> > Do you prefer to change it to:
> > fatload <interface> <dev[:part]>  <addr> <filename> [offset]
> > [bytes]
> > 
> > or to have a new dedicated command, or something else?
> 
> Lets go with:
> fatload <interface> <dev[:part]>  <addr> <filename> [bytes] [offset]
> and
> update the long help text to mention both bytes and offset and that
> offset requires bytes.

OK. Do you want that in an update of this patch or in a separate patch?

You're right: Having [bytes] before [offset] will avoid breaking the current
users of this command. However, this has one drawback: fatls first has to be
used to get the file size (with [offset] first, 0 could be easily used for
offset to access [bytes]). Hence, still with [bytes] first, would you like to
have some special bytes value (let's say -1 or any negative value) meaning "from
offset to end of file"?

Best regards,
Benoît
Benoît Thébaudeau Sept. 22, 2012, 8:32 p.m. UTC | #6
On Saturday, September 15, 2012 12:02:53 AM, Tom Rini wrote:
> On 09/14/2012 03:03 PM, Benoît Thébaudeau wrote:
> > On Friday, September 14, 2012 10:49:04 PM, Tom Rini wrote:
> >> On Mon, Sep 03, 2012 at 04:17:09PM +0200, Beno??t Th??baudeau
> >> wrote:
> >>> Dear Wolfgang Denk,
> >>>
> >>> On Sunday, September 2, 2012 5:28:09 PM, Wolfgang Denk wrote:
> >>>> Dear Beno??t Th??baudeau,
> >>>>
> >>>> In message
> >>>> <1285759492.332736.1342790529256.JavaMail.root@advansee.com> you
> >>>> wrote:
> >>>>> When storage devices contain files larger than the embedded
> >>>>> RAM, it
> >>>>> is usef> ul to
> >>>>> be able to read these files by chunks, e.g. for a software
> >>>>> update
> >>>>> to the
> >>>>> embedded NAND Flash from an external storage device (USB stick,
> >>>>> SD
> >>>>> card, et> c.).
> >>>>>
> >>>>> Hence, this patch makes it possible by adding a new FAT API to
> >>>>> read
> >>>>> files f> rom a
> >>>>> given position.
> >>>>>
> >>>>> Signed-off-by: Beno??t Th??baudeau
> >>>>> <benoit.thebaudeau@advansee.com>
> >>>>> Cc: Wolfgang Denk <wd@denx.de>
> >>>>> ---
> >>>>> Changes for v2:
> >>>>>  - Patch renumbering because of the new v2 1/8.
> >>>>>  - Possible code style changes due to the new v2 1/8.
> >>>>>  - Add missing vairable renaming to fat_write.c.
> >>>>>
> >>>>>  .../fs/fat/fat.c                                   |   88
> >>>>>  ++++++++++++++++> ----
> >>>>>  .../fs/fat/fat_write.c                             |   18 ++--
> >>>>>  2 files changed, 80 insertions(+), 26 deletions(-)
> >>>>
> >>>> I don't see any command line interface to actually use this
> >>>> code.
> >>>>
> >>>> How would I put this to use?
> >>>
> >>> Here is the current "fatload" command line interface:
> >>> fatload <interface> <dev[:part]>  <addr> <filename> [bytes]
> >>>
> >>> Do you prefer to change it to:
> >>> fatload <interface> <dev[:part]>  <addr> <filename> [offset]
> >>> [bytes]
> >>>
> >>> or to have a new dedicated command, or something else?
> >>
> >> Lets go with:
> >> fatload <interface> <dev[:part]>  <addr> <filename> [bytes]
> >> [offset]
> >> and
> >> update the long help text to mention both bytes and offset and
> >> that
> >> offset requires bytes.
> > 
> > OK. Do you want that in an update of this patch or in a separate
> > patch?
> 
> New patch to replace this.
> 
> > You're right: Having [bytes] before [offset] will avoid breaking
> > the current
> > users of this command. However, this has one drawback: fatls first
> > has to be
> > used to get the file size (with [offset] first, 0 could be easily
> > used for
> > offset to access [bytes]). Hence, still with [bytes] first, would
> > you like to
> > have some special bytes value (let's say -1 or any negative value)
> > meaning "from
> > offset to end of file"?
> 
> Lets go with -1 meaning until end of file since we don't have a good
> way
> today to determine total filesize.

OK. I took 0 instead of -1 because 0 already had this behavior.

Done here:
http://patchwork.ozlabs.org/patch/184793/

Best regards,
Benoît
diff mbox

Patch

diff --git u-boot-66714b1.orig/fs/fat/fat.c u-boot-66714b1/fs/fat/fat.c
index 19f6a8c..8c94b28 100644
--- u-boot-66714b1.orig/fs/fat/fat.c
+++ u-boot-66714b1/fs/fat/fat.c
@@ -328,13 +328,16 @@  get_cluster(fsdata *mydata, __u32 clustnum, __u8 *buffer, unsigned long size)
 }
 
 /*
- * Read at most 'maxsize' bytes from the file associated with 'dentptr'
+ * Read at most 'maxsize' bytes from 'pos' in the file associated with 'dentptr'
  * into 'buffer'.
  * Return the number of bytes read or -1 on fatal errors.
  */
+__u8 get_contents_vfatname_block[MAX_CLUSTSIZE]
+	__aligned(ARCH_DMA_MINALIGN);
+
 static long
-get_contents(fsdata *mydata, dir_entry *dentptr, __u8 *buffer,
-	     unsigned long maxsize)
+get_contents(fsdata *mydata, dir_entry *dentptr, unsigned long pos,
+	     __u8 *buffer, unsigned long maxsize)
 {
 	unsigned long filesize = FAT2CPU32(dentptr->size), gotsize = 0;
 	unsigned int bytesperclust = mydata->clust_size * mydata->sect_size;
@@ -344,12 +347,59 @@  get_contents(fsdata *mydata, dir_entry *dentptr, __u8 *buffer,
 
 	debug("Filesize: %ld bytes\n", filesize);
 
-	if (maxsize > 0 && filesize > maxsize)
-		filesize = maxsize;
+	if (pos >= filesize) {
+		debug("Read position past EOF: %lu\n", pos);
+		return gotsize;
+	}
+
+	if (maxsize > 0 && filesize > pos + maxsize)
+		filesize = pos + maxsize;
 
 	debug("%ld bytes\n", filesize);
 
 	actsize = bytesperclust;
+
+	/* go to cluster at pos */
+	while (actsize <= pos) {
+		curclust = get_fatent(mydata, curclust);
+		if (CHECK_CLUST(curclust, mydata->fatsize)) {
+			debug("curclust: 0x%x\n", curclust);
+			debug("Invalid FAT entry\n");
+			return gotsize;
+		}
+		actsize += bytesperclust;
+	}
+
+	/* actsize > pos */
+	actsize -= bytesperclust;
+	filesize -= actsize;
+	pos -= actsize;
+
+	/* align to beginning of next cluster if any */
+	if (pos) {
+		actsize = min(filesize, bytesperclust);
+		if (get_cluster(mydata, curclust, get_contents_vfatname_block,
+				(int)actsize) != 0) {
+			printf("Error reading cluster\n");
+			return -1;
+		}
+		filesize -= actsize;
+		actsize -= pos;
+		memcpy(buffer, get_contents_vfatname_block + pos, actsize);
+		gotsize += actsize;
+		if (!filesize)
+			return gotsize;
+		buffer += actsize;
+
+		curclust = get_fatent(mydata, curclust);
+		if (CHECK_CLUST(curclust, mydata->fatsize)) {
+			debug("curclust: 0x%x\n", curclust);
+			debug("Invalid FAT entry\n");
+			return gotsize;
+		}
+	}
+
+	actsize = bytesperclust;
 	endclust = curclust;
 
 	do {
@@ -433,9 +483,6 @@  static int slot2str(dir_slot *slotptr, char *l_name, int *idx)
  * into 'retdent'
  * Return 0 on success, -1 otherwise.
  */
-__u8 get_vfatname_block[MAX_CLUSTSIZE]
-	__aligned(ARCH_DMA_MINALIGN);
-
 static int
 get_vfatname(fsdata *mydata, int curclust, __u8 *cluster,
 	     dir_entry *retdent, char *l_name)
@@ -474,13 +521,13 @@  get_vfatname(fsdata *mydata, int curclust, __u8 *cluster,
 			return -1;
 		}
 
-		if (get_cluster(mydata, curclust, get_vfatname_block,
+		if (get_cluster(mydata, curclust, get_contents_vfatname_block,
 				mydata->clust_size * mydata->sect_size) != 0) {
 			debug("Error: reading directory block\n");
 			return -1;
 		}
 
-		slotptr2 = (dir_slot *)get_vfatname_block;
+		slotptr2 = (dir_slot *)get_contents_vfatname_block;
 		while (counter > 0) {
 			if (((slotptr2->id & ~LAST_LONG_ENTRY_MASK)
 			    & 0xff) != counter)
@@ -491,7 +538,7 @@  get_vfatname(fsdata *mydata, int curclust, __u8 *cluster,
 
 		/* Save the real directory entry */
 		realdent = (dir_entry *)slotptr2;
-		while ((__u8 *)slotptr2 > get_vfatname_block) {
+		while ((__u8 *)slotptr2 > get_contents_vfatname_block) {
 			slotptr2--;
 			slot2str(slotptr2, l_name, &idx);
 		}
@@ -770,11 +817,12 @@  exit:
 	return ret;
 }
 
-__u8 do_fat_read_block[MAX_CLUSTSIZE]
+__u8 do_fat_read_at_block[MAX_CLUSTSIZE]
 	__aligned(ARCH_DMA_MINALIGN);
 
 long
-do_fat_read(const char *filename, void *buffer, unsigned long maxsize, int dols)
+do_fat_read_at(const char *filename, unsigned long pos, void *buffer,
+	       unsigned long maxsize, int dols)
 {
 	char fnamecopy[2048];
 	boot_sector bs;
@@ -888,12 +936,12 @@  do_fat_read(const char *filename, void *buffer, unsigned long maxsize, int dols)
 					(mydata->fatsize == 32) ?
 					(mydata->clust_size) :
 					PREFETCH_BLOCKS,
-					do_fat_read_block) < 0) {
+					do_fat_read_at_block) < 0) {
 				debug("Error: reading rootdir block\n");
 				goto exit;
 			}
 
-			dentptr = (dir_entry *) do_fat_read_block;
+			dentptr = (dir_entry *) do_fat_read_at_block;
 		}
 
 		for (i = 0; i < DIRENTSPERBLOCK; i++) {
@@ -913,7 +961,7 @@  do_fat_read(const char *filename, void *buffer, unsigned long maxsize, int dols)
 
 					get_vfatname(mydata,
 						     root_cluster,
-						     do_fat_read_block,
+						     do_fat_read_at_block,
 						     dentptr, l_name);
 
 					if (dols == LS_ROOT) {
@@ -1116,7 +1164,7 @@  rootdir_done:
 			subname = nextname;
 	}
 
-	ret = get_contents(mydata, dentptr, buffer, maxsize);
+	ret = get_contents(mydata, dentptr, pos, buffer, maxsize);
 	debug("Size: %d, got: %ld\n", FAT2CPU32(dentptr->size), ret);
 
 exit:
@@ -1124,6 +1172,12 @@  exit:
 	return ret;
 }
 
+long
+do_fat_read(const char *filename, void *buffer, unsigned long maxsize, int dols)
+{
+	return do_fat_read_at(filename, 0, buffer, maxsize, dols);
+}
+
 int file_fat_detectfs(void)
 {
 	boot_sector bs;
diff --git u-boot-66714b1.orig/fs/fat/fat_write.c u-boot-66714b1/fs/fat/fat_write.c
index a6181e7..5829adf 100644
--- u-boot-66714b1.orig/fs/fat/fat_write.c
+++ u-boot-66714b1/fs/fat/fat_write.c
@@ -328,7 +328,7 @@  static void flush_dir_table(fsdata *mydata, dir_entry **dentptr);
 static void
 fill_dir_slot(fsdata *mydata, dir_entry **dentptr, const char *l_name)
 {
-	dir_slot *slotptr = (dir_slot *)get_vfatname_block;
+	dir_slot *slotptr = (dir_slot *)get_contents_vfatname_block;
 	__u8 counter = 0, checksum;
 	int idx = 0, ret;
 	char s_name[16];
@@ -373,7 +373,7 @@  static __u32 dir_curclust;
  * a slot) into 'l_name'. If successful also copy the real directory entry
  * into 'retdent'
  * If additional adjacent cluster for directory entries is read into memory,
- * then 'get_vfatname_block' is copied into 'get_dentfromdir_block' and
+ * then 'get_contents_vfatname_block' is copied into 'get_dentfromdir_block' and
  * the location of the real directory entry is returned by 'retdent'
  * Return 0 on success, -1 otherwise.
  */
@@ -416,13 +416,13 @@  get_long_file_name(fsdata *mydata, int curclust, __u8 *cluster,
 
 		dir_curclust = curclust;
 
-		if (get_cluster(mydata, curclust, get_vfatname_block,
+		if (get_cluster(mydata, curclust, get_contents_vfatname_block,
 				mydata->clust_size * mydata->sect_size) != 0) {
 			debug("Error: reading directory block\n");
 			return -1;
 		}
 
-		slotptr2 = (dir_slot *)get_vfatname_block;
+		slotptr2 = (dir_slot *)get_contents_vfatname_block;
 		while (counter > 0) {
 			if (((slotptr2->id & ~LAST_LONG_ENTRY_MASK)
 			    & 0xff) != counter)
@@ -433,7 +433,7 @@  get_long_file_name(fsdata *mydata, int curclust, __u8 *cluster,
 
 		/* Save the real directory entry */
 		realdent = (dir_entry *)slotptr2;
-		while ((__u8 *)slotptr2 > get_vfatname_block) {
+		while ((__u8 *)slotptr2 > get_contents_vfatname_block) {
 			slotptr2--;
 			slot2str(slotptr2, l_name, &idx);
 		}
@@ -459,9 +459,9 @@  get_long_file_name(fsdata *mydata, int curclust, __u8 *cluster,
 	*retdent = realdent;
 
 	if (slotptr2) {
-		memcpy(get_dentfromdir_block, get_vfatname_block,
+		memcpy(get_dentfromdir_block, get_contents_vfatname_block,
 			mydata->clust_size * mydata->sect_size);
-		cur_position = (__u8 *)realdent - get_vfatname_block;
+		cur_position = (__u8 *)realdent - get_contents_vfatname_block;
 		*retdent = (dir_entry *) &get_dentfromdir_block[cur_position];
 	}
 
@@ -980,11 +980,11 @@  static int do_fat_write(const char *filename, void *buffer,
 	if (disk_read(cursect,
 		(mydata->fatsize == 32) ?
 		(mydata->clust_size) :
-		PREFETCH_BLOCKS, do_fat_read_block) < 0) {
+		PREFETCH_BLOCKS, do_fat_read_at_block) < 0) {
 		debug("Error: reading rootdir block\n");
 		goto exit;
 	}
-	dentptr = (dir_entry *) do_fat_read_block;
+	dentptr = (dir_entry *) do_fat_read_at_block;
 
 	name_len = strlen(filename);
 	if (name_len >= VFAT_MAXLEN_BYTES)