summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorShao Miller <shao.miller@yrdsb.edu.on.ca>2010-06-28 02:26:11 -0400
committerShao Miller <shao.miller@yrdsb.edu.on.ca>2010-07-10 01:03:05 -0400
commit3748a9dc3ead604596b7a2c94014ad3817a107cf (patch)
tree24eddf9aae8b06f53619a0c540dd33d337b2ca8b
parent86bf50325b73618cd67a67d5b9a1781877493c07 (diff)
downloadsyslinux-3748a9dc3ead604596b7a2c94014ad3817a107cf.tar.gz
chain.c32, libcom32: Move write_verify_sector() as disk_write_verify_sector()
Moving portions of chain.c32 into libcom32. Signed-off-by: Shao Miller <shao.miller@yrdsb.edu.on.ca>
-rw-r--r--com32/include/syslinux/disk.h2
-rw-r--r--com32/lib/syslinux/disk.c29
-rw-r--r--com32/modules/chain.c18
3 files changed, 32 insertions, 17 deletions
diff --git a/com32/include/syslinux/disk.h b/com32/include/syslinux/disk.h
index ef002e22..82513ced 100644
--- a/com32/include/syslinux/disk.h
+++ b/com32/include/syslinux/disk.h
@@ -63,5 +63,7 @@ extern void *disk_read_sectors(struct disk_info *diskinfo, uint64_t lba,
uint8_t count);
extern int disk_write_sector(struct disk_info *diskinfo, unsigned int lba,
const void *data);
+extern int disk_write_verify_sector(struct disk_info *diskinfo,
+ unsigned int lba, const void *buf);
#endif /* _SYSLINUX_DISK_H */
diff --git a/com32/lib/syslinux/disk.c b/com32/lib/syslinux/disk.c
index 7b7cbe4d..8223534e 100644
--- a/com32/lib/syslinux/disk.c
+++ b/com32/lib/syslinux/disk.c
@@ -254,3 +254,32 @@ int disk_write_sector(struct disk_info *diskinfo, unsigned int lba,
return 0; /* ok */
}
+
+/**
+ * Write a disk block and verify it was written.
+ *
+ * @v diskinfo The disk drive to write to
+ * @v lba The logical block address to begin writing at
+ * @v buf The data to write
+ * @ret rv 0 upon success, -1 upon failure
+ *
+ * Uses the disk number and information from diskinfo.
+ * Writes a sector to a disk drive starting at lba, then reads it back
+ * to verify it was written correctly.
+ */
+int disk_write_verify_sector(struct disk_info *diskinfo, unsigned int lba,
+ const void *buf)
+{
+ char *rb;
+ int rv;
+
+ rv = disk_write_sector(diskinfo, lba, buf);
+ if (rv)
+ return rv; /* Write failure */
+ rb = disk_read_sectors(diskinfo, lba, 1);
+ if (!rb)
+ return -1; /* Readback failure */
+ rv = memcmp(buf, rb, SECTOR);
+ free(rb);
+ return rv ? -1 : 0;
+}
diff --git a/com32/modules/chain.c b/com32/modules/chain.c
index de827a20..6bf8827e 100644
--- a/com32/modules/chain.c
+++ b/com32/modules/chain.c
@@ -147,22 +147,6 @@ static inline void error(const char *msg)
static struct disk_info diskinfo;
-static int write_verify_sector(unsigned int lba, const void *buf)
-{
- char *rb;
- int rv;
-
- rv = disk_write_sector(&diskinfo, lba, buf);
- if (rv)
- return rv; /* Write failure */
- rb = disk_read_sectors(&diskinfo, lba, 1);
- if (!rb)
- return -1; /* Readback failure */
- rv = memcmp(buf, rb, SECTOR);
- free(rb);
- return rv ? -1 : 0;
-}
-
/*
* CHS (cylinder, head, sector) value extraction macros.
* Taken from WinVBlock. Does not expand to an lvalue
@@ -1008,7 +992,7 @@ static int hide_unhide(struct mbr *mbr, int part)
}
if (write_back)
- return write_verify_sector(0, mbr);
+ return disk_write_verify_sector(&diskinfo, 0, mbr);
return 0; /* ok */
}