Browse Source

Add lock/unlock functions to blockdev_iface

Since one blockdev_iface could be shared by multi block devices
lock/unlock functions is needed. Locks are not needed in single
partition mode.
pull/11/head
gkostka 9 years ago
parent
commit
c8e804846c
  1. 17
      blockdev/blockdev.c
  2. 2
      blockdev/linux/ext4_filedev.c
  3. 322
      blockdev/windows/io_raw.c
  4. 88
      blockdev/windows/io_raw.h
  5. 59
      lwext4/ext4_blockdev.c
  6. 16
      lwext4/ext4_blockdev.h

17
blockdev/blockdev.c

@ -39,10 +39,13 @@ static int blockdev_bread(struct ext4_blockdev *bdev, void *buf, uint64_t blk_id
static int blockdev_bwrite(struct ext4_blockdev *bdev, const void *buf, static int blockdev_bwrite(struct ext4_blockdev *bdev, const void *buf,
uint64_t blk_id, uint32_t blk_cnt); uint64_t blk_id, uint32_t blk_cnt);
static int blockdev_close(struct ext4_blockdev *bdev); static int blockdev_close(struct ext4_blockdev *bdev);
static int blockdev_lock(struct ext4_blockdev *bdev);
static int blockdev_unlock(struct ext4_blockdev *bdev);
/******************************************************************************/ /******************************************************************************/
EXT4_BLOCKDEV_STATIC_INSTANCE(blockdev, 512, 0, blockdev_open, EXT4_BLOCKDEV_STATIC_INSTANCE(blockdev, 512, 0, blockdev_open,
blockdev_bread, blockdev_bwrite, blockdev_close); blockdev_bread, blockdev_bwrite, blockdev_close,
blockdev_lock, blockdev_unlock);
/******************************************************************************/ /******************************************************************************/
static int blockdev_open(struct ext4_blockdev *bdev) static int blockdev_open(struct ext4_blockdev *bdev)
@ -75,6 +78,18 @@ static int blockdev_close(struct ext4_blockdev *bdev)
return EIO; return EIO;
} }
static int blockdev_lock(struct ext4_blockdev *bdev)
{
/*blockdev_lock: skeleton*/
return EIO;
}
static int blockdev_unlock(struct ext4_blockdev *bdev)
{
/*blockdev_unlock: skeleton*/
return EIO;
}
/******************************************************************************/ /******************************************************************************/
struct ext4_blockdev *ext4_blockdev_get(void) struct ext4_blockdev *ext4_blockdev_get(void)
{ {

2
blockdev/linux/ext4_filedev.c

@ -58,7 +58,7 @@ static int filedev_close(struct ext4_blockdev *bdev);
/******************************************************************************/ /******************************************************************************/
EXT4_BLOCKDEV_STATIC_INSTANCE(_filedev, EXT4_FILEDEV_BSIZE, 0, filedev_open, EXT4_BLOCKDEV_STATIC_INSTANCE(_filedev, EXT4_FILEDEV_BSIZE, 0, filedev_open,
filedev_bread, filedev_bwrite, filedev_close); filedev_bread, filedev_bwrite, filedev_close, 0, 0);
/******************************************************************************/ /******************************************************************************/
static int filedev_open(struct ext4_blockdev *bdev) static int filedev_open(struct ext4_blockdev *bdev)

322
blockdev/windows/io_raw.c

@ -1,161 +1,161 @@
/* /*
* Copyright (c) 2013 Grzegorz Kostka (kostka.grzegorz@gmail.com) * Copyright (c) 2013 Grzegorz Kostka (kostka.grzegorz@gmail.com)
* All rights reserved. * All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions * modification, are permitted provided that the following conditions
* are met: * are met:
* *
* - Redistributions of source code must retain the above copyright * - Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer. * notice, this list of conditions and the following disclaimer.
* - Redistributions in binary form must reproduce the above copyright * - Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the * notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution. * documentation and/or other materials provided with the distribution.
* - The name of the author may not be used to endorse or promote products * - The name of the author may not be used to endorse or promote products
* derived from this software without specific prior written permission. * derived from this software without specific prior written permission.
* *
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/ */
#include <ext4_config.h> #include <ext4_config.h>
#include <ext4_blockdev.h> #include <ext4_blockdev.h>
#include <ext4_errno.h> #include <ext4_errno.h>
#include <stdio.h> #include <stdio.h>
#include <stdbool.h> #include <stdbool.h>
#include <string.h> #include <string.h>
#ifdef WIN32 #ifdef WIN32
#include <windows.h> #include <windows.h>
#include <winioctl.h> #include <winioctl.h>
/**@brief Default filename.*/ /**@brief Default filename.*/
static const char *fname = "ext2"; static const char *fname = "ext2";
/**@brief IO block size.*/ /**@brief IO block size.*/
#define EXT4_IORAW_BSIZE 512 #define EXT4_IORAW_BSIZE 512
/**@brief Image file descriptor.*/ /**@brief Image file descriptor.*/
static HANDLE dev_file; static HANDLE dev_file;
/**********************BLOCKDEV INTERFACE**************************************/ /**********************BLOCKDEV INTERFACE**************************************/
static int io_raw_open(struct ext4_blockdev *bdev); static int io_raw_open(struct ext4_blockdev *bdev);
static int io_raw_bread(struct ext4_blockdev *bdev, void *buf, uint64_t blk_id, static int io_raw_bread(struct ext4_blockdev *bdev, void *buf, uint64_t blk_id,
uint32_t blk_cnt); uint32_t blk_cnt);
static int io_raw_bwrite(struct ext4_blockdev *bdev, const void *buf, static int io_raw_bwrite(struct ext4_blockdev *bdev, const void *buf,
uint64_t blk_id, uint32_t blk_cnt); uint64_t blk_id, uint32_t blk_cnt);
static int io_raw_close(struct ext4_blockdev *bdev); static int io_raw_close(struct ext4_blockdev *bdev);
/******************************************************************************/ /******************************************************************************/
EXT4_BLOCKDEV_STATIC_INSTANCE(_filedev, EXT4_IORAW_BSIZE, 0, io_raw_open, EXT4_BLOCKDEV_STATIC_INSTANCE(_filedev, EXT4_IORAW_BSIZE, 0, io_raw_open,
io_raw_bread, io_raw_bwrite, io_raw_close); io_raw_bread, io_raw_bwrite, io_raw_close, 0, 0);
/******************************************************************************/ /******************************************************************************/
static int io_raw_open(struct ext4_blockdev *bdev) static int io_raw_open(struct ext4_blockdev *bdev)
{ {
char path[64]; char path[64];
DISK_GEOMETRY pdg; DISK_GEOMETRY pdg;
uint64_t disk_size; uint64_t disk_size;
BOOL bResult = FALSE; BOOL bResult = FALSE;
DWORD junk; DWORD junk;
sprintf(path, "\\\\.\\%s", fname); sprintf(path, "\\\\.\\%s", fname);
dev_file = dev_file =
CreateFile(path, GENERIC_READ | GENERIC_WRITE, CreateFile(path, GENERIC_READ | GENERIC_WRITE,
FILE_SHARE_WRITE | FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_SHARE_WRITE | FILE_SHARE_READ, NULL, OPEN_EXISTING,
FILE_FLAG_NO_BUFFERING | FILE_FLAG_WRITE_THROUGH, NULL); FILE_FLAG_NO_BUFFERING | FILE_FLAG_WRITE_THROUGH, NULL);
if (dev_file == INVALID_HANDLE_VALUE) { if (dev_file == INVALID_HANDLE_VALUE) {
return EIO; return EIO;
} }
bResult = bResult =
DeviceIoControl(dev_file, IOCTL_DISK_GET_DRIVE_GEOMETRY, NULL, 0, DeviceIoControl(dev_file, IOCTL_DISK_GET_DRIVE_GEOMETRY, NULL, 0,
&pdg, sizeof(pdg), &junk, (LPOVERLAPPED)NULL); &pdg, sizeof(pdg), &junk, (LPOVERLAPPED)NULL);
if (bResult == FALSE) { if (bResult == FALSE) {
CloseHandle(dev_file); CloseHandle(dev_file);
return EIO; return EIO;
} }
disk_size = pdg.Cylinders.QuadPart * (ULONG)pdg.TracksPerCylinder * disk_size = pdg.Cylinders.QuadPart * (ULONG)pdg.TracksPerCylinder *
(ULONG)pdg.SectorsPerTrack * (ULONG)pdg.BytesPerSector; (ULONG)pdg.SectorsPerTrack * (ULONG)pdg.BytesPerSector;
_filedev.ph_bsize = pdg.BytesPerSector; _filedev.bdif->ph_bsize = pdg.BytesPerSector;
_filedev.ph_bcnt = disk_size / pdg.BytesPerSector; _filedev.bdif->ph_bcnt = disk_size / pdg.BytesPerSector;
return EOK; return EOK;
} }
/******************************************************************************/ /******************************************************************************/
static int io_raw_bread(struct ext4_blockdev *bdev, void *buf, uint64_t blk_id, static int io_raw_bread(struct ext4_blockdev *bdev, void *buf, uint64_t blk_id,
uint32_t blk_cnt) uint32_t blk_cnt)
{ {
long hipart = blk_id >> (32 - 9); long hipart = blk_id >> (32 - 9);
long lopart = blk_id << 9; long lopart = blk_id << 9;
long err; long err;
SetLastError(0); SetLastError(0);
lopart = SetFilePointer(dev_file, lopart, &hipart, FILE_BEGIN); lopart = SetFilePointer(dev_file, lopart, &hipart, FILE_BEGIN);
if (lopart == -1 && NO_ERROR != (err = GetLastError())) { if (lopart == -1 && NO_ERROR != (err = GetLastError())) {
return EIO; return EIO;
} }
DWORD n; DWORD n;
if (!ReadFile(dev_file, buf, blk_cnt * 512, &n, NULL)) { if (!ReadFile(dev_file, buf, blk_cnt * 512, &n, NULL)) {
err = GetLastError(); err = GetLastError();
return EIO; return EIO;
} }
return EOK; return EOK;
} }
/******************************************************************************/ /******************************************************************************/
static int io_raw_bwrite(struct ext4_blockdev *bdev, const void *buf, static int io_raw_bwrite(struct ext4_blockdev *bdev, const void *buf,
uint64_t blk_id, uint32_t blk_cnt) uint64_t blk_id, uint32_t blk_cnt)
{ {
long hipart = blk_id >> (32 - 9); long hipart = blk_id >> (32 - 9);
long lopart = blk_id << 9; long lopart = blk_id << 9;
long err; long err;
SetLastError(0); SetLastError(0);
lopart = SetFilePointer(dev_file, lopart, &hipart, FILE_BEGIN); lopart = SetFilePointer(dev_file, lopart, &hipart, FILE_BEGIN);
if (lopart == -1 && NO_ERROR != (err = GetLastError())) { if (lopart == -1 && NO_ERROR != (err = GetLastError())) {
return EIO; return EIO;
} }
DWORD n; DWORD n;
if (!WriteFile(dev_file, buf, blk_cnt * 512, &n, NULL)) { if (!WriteFile(dev_file, buf, blk_cnt * 512, &n, NULL)) {
err = GetLastError(); err = GetLastError();
return EIO; return EIO;
} }
return EOK; return EOK;
} }
/******************************************************************************/ /******************************************************************************/
static int io_raw_close(struct ext4_blockdev *bdev) static int io_raw_close(struct ext4_blockdev *bdev)
{ {
CloseHandle(dev_file); CloseHandle(dev_file);
return EOK; return EOK;
} }
/******************************************************************************/ /******************************************************************************/
struct ext4_blockdev *ext4_io_raw_dev_get(void) { return &_filedev; } struct ext4_blockdev *ext4_io_raw_dev_get(void) { return &_filedev; }
/******************************************************************************/ /******************************************************************************/
void ext4_io_raw_filename(const char *n) { fname = n; } void ext4_io_raw_filename(const char *n) { fname = n; }
/******************************************************************************/ /******************************************************************************/
#endif #endif

88
blockdev/windows/io_raw.h

@ -1,44 +1,44 @@
/* /*
* Copyright (c) 2013 Grzegorz Kostka (kostka.grzegorz@gmail.com) * Copyright (c) 2013 Grzegorz Kostka (kostka.grzegorz@gmail.com)
* All rights reserved. * All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions * modification, are permitted provided that the following conditions
* are met: * are met:
* *
* - Redistributions of source code must retain the above copyright * - Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer. * notice, this list of conditions and the following disclaimer.
* - Redistributions in binary form must reproduce the above copyright * - Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the * notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution. * documentation and/or other materials provided with the distribution.
* - The name of the author may not be used to endorse or promote products * - The name of the author may not be used to endorse or promote products
* derived from this software without specific prior written permission. * derived from this software without specific prior written permission.
* *
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/ */
#ifndef IO_RAW_H_ #ifndef IO_RAW_H_
#define IO_RAW_H_ #define IO_RAW_H_
#include <ext4_config.h> #include <ext4_config.h>
#include <ext4_blockdev.h> #include <ext4_blockdev.h>
#include <stdint.h> #include <stdint.h>
#include <stdbool.h> #include <stdbool.h>
/**@brief IO raw blockdev get.*/ /**@brief IO raw blockdev get.*/
struct ext4_blockdev *ext4_io_raw_dev_get(void); struct ext4_blockdev *ext4_io_raw_dev_get(void);
/**@brief Set filrname to open.*/ /**@brief Set filrname to open.*/
void ext4_io_raw_filename(const char *n); void ext4_io_raw_filename(const char *n);
#endif /* IO_RAW_H_ */ #endif /* IO_RAW_H_ */

59
lwext4/ext4_blockdev.c

@ -42,6 +42,42 @@
#include <string.h> #include <string.h>
#include <stdlib.h> #include <stdlib.h>
static void ext4_bdif_lock(struct ext4_blockdev *bdev)
{
if (!bdev->bdif->lock)
return;
int r = bdev->bdif->lock(bdev);
ext4_assert(r == EOK);
}
static void ext4_bdif_unlock(struct ext4_blockdev *bdev)
{
if (!bdev->bdif->unlock)
return;
int r = bdev->bdif->unlock(bdev);
ext4_assert(r == EOK);
}
static int ext4_bdif_bread(struct ext4_blockdev *bdev, void *buf,
uint64_t blk_id, uint32_t blk_cnt)
{
ext4_bdif_lock(bdev);
int r = bdev->bdif->bread(bdev, buf, blk_id, blk_cnt);
ext4_bdif_unlock(bdev);
return r;
}
static int ext4_bdif_bwrite(struct ext4_blockdev *bdev, const void *buf,
uint64_t blk_id, uint32_t blk_cnt)
{
ext4_bdif_lock(bdev);
int r = bdev->bdif->bwrite(bdev, buf, blk_id, blk_cnt);
ext4_bdif_unlock(bdev);
return r;
}
int ext4_block_init(struct ext4_blockdev *bdev) int ext4_block_init(struct ext4_blockdev *bdev)
{ {
int rc; int rc;
@ -225,7 +261,7 @@ int ext4_blocks_get_direct(struct ext4_blockdev *bdev, void *buf, uint64_t lba,
pb_cnt = bdev->lg_bsize / bdev->bdif->ph_bsize; pb_cnt = bdev->lg_bsize / bdev->bdif->ph_bsize;
bdev->bread_ctr++; bdev->bread_ctr++;
return bdev->bdif->bread(bdev, buf, pba, pb_cnt * cnt); return ext4_bdif_bread(bdev, buf, pba, pb_cnt * cnt);
} }
int ext4_blocks_set_direct(struct ext4_blockdev *bdev, const void *buf, int ext4_blocks_set_direct(struct ext4_blockdev *bdev, const void *buf,
@ -241,8 +277,7 @@ int ext4_blocks_set_direct(struct ext4_blockdev *bdev, const void *buf,
pb_cnt = bdev->lg_bsize / bdev->bdif->ph_bsize; pb_cnt = bdev->lg_bsize / bdev->bdif->ph_bsize;
bdev->bwrite_ctr++; bdev->bwrite_ctr++;
return ext4_bdif_bwrite(bdev, buf, pba, pb_cnt * cnt);
return bdev->bdif->bwrite(bdev, buf, pba, pb_cnt * cnt);
} }
int ext4_block_writebytes(struct ext4_blockdev *bdev, uint64_t off, int ext4_block_writebytes(struct ext4_blockdev *bdev, uint64_t off,
@ -275,13 +310,12 @@ int ext4_block_writebytes(struct ext4_blockdev *bdev, uint64_t off,
? len ? len
: (bdev->bdif->ph_bsize - unalg); : (bdev->bdif->ph_bsize - unalg);
r = bdev->bdif->bread(bdev, bdev->bdif->ph_bbuf, block_idx, 1); r = ext4_bdif_bread(bdev, bdev->bdif->ph_bbuf, block_idx, 1);
if (r != EOK) if (r != EOK)
return r; return r;
memcpy(bdev->bdif->ph_bbuf + unalg, p, wlen); memcpy(bdev->bdif->ph_bbuf + unalg, p, wlen);
r = ext4_bdif_bwrite(bdev, bdev->bdif->ph_bbuf, block_idx, 1);
r = bdev->bdif->bwrite(bdev, bdev->bdif->ph_bbuf, block_idx, 1);
if (r != EOK) if (r != EOK)
return r; return r;
@ -292,7 +326,7 @@ int ext4_block_writebytes(struct ext4_blockdev *bdev, uint64_t off,
/*Aligned data*/ /*Aligned data*/
blen = len / bdev->bdif->ph_bsize; blen = len / bdev->bdif->ph_bsize;
r = bdev->bdif->bwrite(bdev, p, block_idx, blen); r = ext4_bdif_bwrite(bdev, p, block_idx, blen);
if (r != EOK) if (r != EOK)
return r; return r;
@ -303,13 +337,12 @@ int ext4_block_writebytes(struct ext4_blockdev *bdev, uint64_t off,
/*Rest of the data*/ /*Rest of the data*/
if (len) { if (len) {
r = bdev->bdif->bread(bdev, bdev->bdif->ph_bbuf, block_idx, 1); r = ext4_bdif_bread(bdev, bdev->bdif->ph_bbuf, block_idx, 1);
if (r != EOK) if (r != EOK)
return r; return r;
memcpy(bdev->bdif->ph_bbuf, p, len); memcpy(bdev->bdif->ph_bbuf, p, len);
r = ext4_bdif_bwrite(bdev, bdev->bdif->ph_bbuf, block_idx, 1);
r = bdev->bdif->bwrite(bdev, bdev->bdif->ph_bbuf, block_idx, 1);
if (r != EOK) if (r != EOK)
return r; return r;
} }
@ -347,7 +380,7 @@ int ext4_block_readbytes(struct ext4_blockdev *bdev, uint64_t off, void *buf,
? len ? len
: (bdev->bdif->ph_bsize - unalg); : (bdev->bdif->ph_bsize - unalg);
r = bdev->bdif->bread(bdev, bdev->bdif->ph_bbuf, block_idx, 1); r = ext4_bdif_bread(bdev, bdev->bdif->ph_bbuf, block_idx, 1);
if (r != EOK) if (r != EOK)
return r; return r;
@ -361,7 +394,7 @@ int ext4_block_readbytes(struct ext4_blockdev *bdev, uint64_t off, void *buf,
/*Aligned data*/ /*Aligned data*/
blen = len / bdev->bdif->ph_bsize; blen = len / bdev->bdif->ph_bsize;
r = bdev->bdif->bread(bdev, p, block_idx, blen); r = ext4_bdif_bread(bdev, p, block_idx, blen);
if (r != EOK) if (r != EOK)
return r; return r;
@ -372,7 +405,7 @@ int ext4_block_readbytes(struct ext4_blockdev *bdev, uint64_t off, void *buf,
/*Rest of the data*/ /*Rest of the data*/
if (len) { if (len) {
r = bdev->bdif->bread(bdev, bdev->bdif->ph_bbuf, block_idx, 1); r = ext4_bdif_bread(bdev, bdev->bdif->ph_bbuf, block_idx, 1);
if (r != EOK) if (r != EOK)
return r; return r;

16
lwext4/ext4_blockdev.h

@ -71,6 +71,16 @@ struct ext4_blockdev_iface {
* @param bdev block device.*/ * @param bdev block device.*/
int (*close)(struct ext4_blockdev *bdev); int (*close)(struct ext4_blockdev *bdev);
/**@brief Lock block device. Required in multi partition mode
* operations. Not mandatory field.
* @param bdev block device.*/
int (*lock)(struct ext4_blockdev *bdev);
/**@brief Unlock block device. Required in multi partition mode
* operations. Not mandatory field.
* @param bdev block device.*/
int (*unlock)(struct ext4_blockdev *bdev);
/**@brief Block size (bytes): physical*/ /**@brief Block size (bytes): physical*/
uint32_t ph_bsize; uint32_t ph_bsize;
@ -112,14 +122,16 @@ struct ext4_blockdev {
}; };
/**@brief Static initialization of the block device.*/ /**@brief Static initialization of the block device.*/
#define EXT4_BLOCKDEV_STATIC_INSTANCE(__name, __bsize, __bcnt, __open, \ #define EXT4_BLOCKDEV_STATIC_INSTANCE(__name, __bsize, __bcnt, __open, __bread,\
__bread, __bwrite, __close) \ __bwrite, __close, __lock, __unlock) \
static uint8_t __name##_ph_bbuf[(__bsize)]; \ static uint8_t __name##_ph_bbuf[(__bsize)]; \
static struct ext4_blockdev_iface __name##_iface = { \ static struct ext4_blockdev_iface __name##_iface = { \
.open = __open, \ .open = __open, \
.bread = __bread, \ .bread = __bread, \
.bwrite = __bwrite, \ .bwrite = __bwrite, \
.close = __close, \ .close = __close, \
.lock = __lock, \
.unlock = __unlock, \
.ph_bsize = __bsize, \ .ph_bsize = __bsize, \
.ph_bcnt = __bcnt, \ .ph_bcnt = __bcnt, \
.ph_bbuf = __name##_ph_bbuf, \ .ph_bbuf = __name##_ph_bbuf, \

Loading…
Cancel
Save