Lines Matching refs:disk

32 #include "disk.h"
105 los_disk *disk = NULL;
122 disk = get_disk(diskID);
123 if ((disk != NULL) && (disk->disk_status == STAT_UNUSED)) {
124 disk->disk_status = STAT_UNREADY;
131 if ((disk == NULL) || (diskID == SYS_MAX_DISK)) {
136 if (disk->disk_name != NULL) {
137 LOS_MemFree(m_aucSysMem0, disk->disk_name);
138 disk->disk_name = NULL;
141 disk->disk_name = LOS_MemAlloc(m_aucSysMem0, (nameLen + 1));
142 if (disk->disk_name == NULL) {
143 PRINT_ERR("los_alloc_diskid_byname alloc disk name failed\n");
147 if (strncpy_s(disk->disk_name, (nameLen + 1), diskName, nameLen) != EOK) {
149 LOS_MemFree(m_aucSysMem0, disk->disk_name);
150 disk->disk_name = NULL;
154 disk->disk_name[nameLen] = '\0';
162 los_disk *disk = NULL;
177 disk = get_disk(diskID);
178 if ((disk != NULL) && (disk->disk_name != NULL) && (disk->disk_status == STAT_INUSED)) {
179 if (strlen(disk->disk_name) != diskNameLen) {
182 if (strcmp(diskName, disk->disk_name) == 0) {
187 if ((disk == NULL) || (diskID == SYS_MAX_DISK)) {
199 los_disk *disk = get_disk(diskId);
200 if (disk == NULL) {
202 } else if ((disk->type == type) && (strncmp(disk->disk_name, mmcDevHead, strlen(mmcDevHead)) == 0)) {
203 return disk;
206 PRINT_ERR("Cannot find the mmc disk!\n");
252 los_disk *disk = get_disk((INT32)part->disk_id);
253 firstPart = (disk == NULL) ? NULL : LOS_DL_LIST_ENTRY(disk->head.pstNext, los_part, list);
257 static VOID DiskPartAddToDisk(los_disk *disk, los_part *part)
259 part->disk_id = disk->disk_id;
260 part->part_no_disk = disk->part_count;
261 LOS_ListTailInsert(&disk->head, &part->list);
262 disk->part_count++;
265 static VOID DiskPartDelFromDisk(los_disk *disk, los_part *part)
268 disk->part_count--;
317 static INT32 DiskAddPart(los_disk *disk, UINT64 sectorStart, UINT64 sectorCount, BOOL IsValidPart)
325 if ((disk == NULL) || (disk->disk_status == STAT_UNUSED) ||
326 (disk->dev == NULL)) {
330 if ((sectorCount > disk->sector_count) || ((disk->sector_count - sectorCount) < sectorStart)) {
335 diskDev = disk->dev;
338 ((disk->disk_name == NULL) ? "null" : disk->disk_name), 'p', disk->part_count);
365 DiskPartAddToDisk(disk, part);
366 if (disk->type == EMMC) {
372 static INT32 DiskDivide(los_disk *disk, struct disk_divide_info *info)
377 disk->type = info->part[0].type;
389 ret = DiskAddPart(disk, info->part[i].sector_start, info->part[i].sector_count, TRUE);
395 ret = DiskAddPart(disk, info->part[i].sector_start, info->part[i].sector_count, TRUE);
666 PRINT_ERR("extended partition is out of disk range: extendedAddress = %u, extendedOffset = %u\n",
752 INT32 DiskPartitionRegister(los_disk *disk)
763 parInfo.sector_size = disk->sector_size;
764 parInfo.sector_count = disk->sector_count;
765 count = DiskPartitionRecognition(disk->dev, &parInfo);
767 part = get_part(DiskAddPart(disk, 0, disk->sector_count, FALSE));
772 PRINTK("Disk %s doesn't contain a valid partition table.\n", disk->disk_name);
780 part = get_part(DiskAddPart(disk, 0, disk->sector_count, TRUE));
794 part = get_part(DiskAddPart(disk, parInfo.part[i].sector_start, parInfo.part[i].sector_count, TRUE));
807 static INT32 disk_read_directly(los_disk *disk, VOID *buf, UINT64 sector, UINT32 count)
810 struct block_operations *bops = (struct block_operations *)((struct drv_data *)disk->dev->data)->ops;
814 if (LOS_IsUserAddressRange((VADDR_T)buf, count * disk->sector_size)) {
816 UINT8 *buffer = disk->buff;
819 result = bops->read(disk->dev, buffer, sector, cnt);
825 if (LOS_CopyFromKernel(buf, disk->sector_size * cnt, buffer, disk->sector_size * cnt)) {
829 buf = (UINT8 *)buf + disk->sector_size * cnt;
833 result = bops->read(disk->dev, buf, sector, count);
842 static INT32 disk_write_directly(los_disk *disk, const VOID *buf, UINT64 sector, UINT32 count)
844 struct block_operations *bops = (struct block_operations *)((struct drv_data *)disk->dev->data)->ops;
849 if (LOS_IsUserAddressRange((VADDR_T)buf, count * disk->sector_size)) {
851 UINT8 *buffer = disk->buff;
854 if (LOS_CopyToKernel(buffer, disk->sector_size * cnt, buf, disk->sector_size * cnt)) {
858 result = bops->write(disk->dev, buffer, sector, cnt);
864 buf = (UINT8 *)buf + disk->sector_size * cnt;
868 result = bops->write(disk->dev, buf, sector, count);
884 los_disk *disk = get_disk(drvID);
890 if (disk == NULL) {
894 DISK_LOCK(&disk->disk_mutex);
896 if (disk->disk_status != STAT_INUSED) {
900 if ((count > disk->sector_count) || ((disk->sector_count - count) < sector)) {
905 if (disk->bcache != NULL) {
906 if (((UINT64)(disk->bcache->sectorSize) * count) > UINT_MAX) {
909 len = disk->bcache->sectorSize * count;
911 result = BlockCacheRead(disk->bcache, (UINT8 *)buf, &len, sector, useRead);
919 if (disk->dev == NULL) {
922 result = disk_read_directly(disk, buf, sector, count);
928 DISK_UNLOCK(&disk->disk_mutex);
932 DISK_UNLOCK(&disk->disk_mutex);
942 los_disk *disk = get_disk(drvID);
943 if (disk == NULL || disk->dev == NULL || disk->dev->data == NULL) {
951 DISK_LOCK(&disk->disk_mutex);
953 if (disk->disk_status != STAT_INUSED) {
957 if ((count > disk->sector_count) || ((disk->sector_count - count) < sector)) {
962 if (disk->bcache != NULL) {
963 if (((UINT64)(disk->bcache->sectorSize) * count) > UINT_MAX) {
966 len = disk->bcache->sectorSize * count;
967 result = BlockCacheWrite(disk->bcache, (const UINT8 *)buf, &len, sector);
975 if (disk->dev == NULL) {
978 result = disk_write_directly(disk, buf, sector, count);
984 DISK_UNLOCK(&disk->disk_mutex);
988 DISK_UNLOCK(&disk->disk_mutex);
995 los_disk *disk = get_disk(drvID);
996 if (disk == NULL) {
1000 DISK_LOCK(&disk->disk_mutex);
1002 if ((disk->dev == NULL) || (disk->disk_status != STAT_INUSED)) {
1007 DISK_UNLOCK(&disk->disk_mutex);
1017 struct block_operations *bops = (struct block_operations *)((struct drv_data *)disk->dev->data)->ops;
1019 (bops->geometry(disk->dev, &info) != 0)) {
1037 DISK_UNLOCK(&disk->disk_mutex);
1041 DISK_UNLOCK(&disk->disk_mutex);
1048 los_disk *disk = NULL;
1055 disk = get_disk((INT32)part->disk_id);
1056 if (disk == NULL) {
1060 DISK_LOCK(&disk->disk_mutex);
1061 if ((part->dev == NULL) || (disk->disk_status != STAT_INUSED)) {
1072 if ((disk->sector_count - part->sector_start) > sector) {
1093 DISK_UNLOCK(&disk->disk_mutex);
1097 DISK_UNLOCK(&disk->disk_mutex);
1104 los_disk *disk = NULL;
1111 disk = get_disk((INT32)part->disk_id);
1112 if (disk == NULL) {
1116 DISK_LOCK(&disk->disk_mutex);
1117 if ((part->dev == NULL) || (disk->disk_status != STAT_INUSED)) {
1128 if ((disk->sector_count - part->sector_start) > sector) {
1148 DISK_UNLOCK(&disk->disk_mutex);
1152 DISK_UNLOCK(&disk->disk_mutex);
1162 los_disk *disk = NULL;
1168 disk = get_disk((INT32)part->disk_id);
1169 if (disk == NULL) {
1173 DISK_LOCK(&disk->disk_mutex);
1174 if ((part->dev == NULL) || (disk->disk_status != STAT_INUSED)) {
1179 DISK_UNLOCK(&disk->disk_mutex);
1211 DISK_UNLOCK(&disk->disk_mutex);
1215 DISK_UNLOCK(&disk->disk_mutex);
1224 los_disk *disk = NULL;
1235 disk = get_disk(part->disk_id);
1236 if (disk == NULL) {
1240 DISK_LOCK(&disk->disk_mutex);
1241 result = BcacheClearCache(disk->bcache);
1242 DISK_UNLOCK(&disk->disk_mutex);
1283 PRINT_ERR("disk_init : disk have not init bcache cache!\n");
1291 static VOID DiskCacheDeinit(los_disk *disk)
1293 UINT32 diskID = disk->disk_id;
1295 if (BcacheAsyncPrereadDeinit(disk->bcache) != LOS_OK) {
1299 BcacheSyncThreadDeinit(disk->bcache);
1303 BlockCacheDeinit(disk->bcache);
1304 disk->bcache = NULL;
1313 struct Vnode *blkDriver, los_disk *disk)
1316 disk->disk_id = diskID;
1317 disk->dev = blkDriver;
1318 disk->sector_start = 0;
1319 disk->sector_size = diskInfo->geo_sectorsize;
1320 disk->sector_count = diskInfo->geo_nsectors;
1324 if (disk->disk_name != NULL) {
1325 LOS_MemFree(m_aucSysMem0, disk->disk_name);
1326 disk->disk_name = NULL;
1329 disk->disk_name = LOS_MemAlloc(m_aucSysMem0, (nameLen + 1));
1330 if (disk->disk_name == NULL) {
1335 if (strncpy_s(disk->disk_name, (nameLen + 1), diskName, nameLen) != EOK) {
1337 LOS_MemFree(m_aucSysMem0, disk->disk_name);
1338 disk->disk_name = NULL;
1341 disk->disk_name[nameLen] = '\0';
1342 LOS_ListInit(&disk->head);
1345 static INT32 DiskDivideAndPartitionRegister(struct disk_divide_info *info, los_disk *disk)
1350 ret = DiskDivide(disk, info);
1356 ret = DiskPartitionRegister(disk);
1365 static INT32 DiskDeinit(los_disk *disk)
1372 if (LOS_ListEmpty(&disk->head) == FALSE) {
1373 part = LOS_DL_LIST_ENTRY(disk->head.pstNext, los_part, list);
1374 while (&part->list != &disk->head) {
1375 diskName = (disk->disk_name == NULL) ? "null" : disk->disk_name;
1377 diskName, 'p', disk->part_count - 1);
1381 DiskPartDelFromDisk(disk, part);
1385 part = LOS_DL_LIST_ENTRY(disk->head.pstNext, los_part, list);
1389 DISK_LOCK(&disk->disk_mutex);
1392 DiskCacheDeinit(disk);
1394 if (disk->buff != NULL) {
1395 free(disk->buff);
1399 disk->dev = NULL;
1400 DISK_UNLOCK(&disk->disk_mutex);
1401 (VOID)unregister_blockdriver(disk->disk_name);
1402 if (disk->disk_name != NULL) {
1403 LOS_MemFree(m_aucSysMem0, disk->disk_name);
1404 disk->disk_name = NULL;
1406 ret = pthread_mutex_destroy(&disk->disk_mutex);
1412 disk->disk_status = STAT_UNUSED;
1417 static UINT32 OsDiskInitSub(const CHAR *diskName, INT32 diskID, los_disk *disk,
1426 disk->bcache = bc;
1431 (VOID)pthread_mutex_init(&disk->disk_mutex, &attr);
1433 DiskStructInit(diskName, diskID, diskInfo, blkDriver, disk);
1436 disk->buff = malloc(diskInfo->geo_sectorsize * DISK_DIRECT_BUFFER_SIZE);
1437 if (disk->buff == NULL) {
1438 PRINT_ERR("OsDiskInitSub: direct buffer of disk init failed\n");
1451 los_disk *disk = get_disk(diskID);
1454 if ((diskName == NULL) || (disk == NULL) ||
1455 (disk->disk_status != STAT_UNREADY) || (strlen(diskName) > DISK_NAME)) {
1481 ret = OsDiskInitSub(diskName, diskID, disk, &diskInfo, blkDriver);
1483 (VOID)DiskDeinit(disk);
1488 if (DiskDivideAndPartitionRegister(info, disk) != ENOERR) {
1489 (VOID)DiskDeinit(disk);
1493 disk->disk_status = STAT_INUSED;
1495 disk->type = EMMC;
1497 disk->type = OTHERS;
1502 PRINT_ERR("disk_init : register %s ok but get disk info fail!\n", diskName);
1512 los_disk *disk = get_disk(diskID);
1513 if (disk == NULL) {
1516 ret = ForceUmountDev(disk->dev);
1517 PRINTK("warning: %s lost, force umount ret = %d\n", disk->disk_name, ret);
1519 DISK_LOCK(&disk->disk_mutex);
1521 if (disk->disk_status != STAT_INUSED) {
1522 DISK_UNLOCK(&disk->disk_mutex);
1526 disk->disk_status = STAT_UNREADY;
1527 DISK_UNLOCK(&disk->disk_mutex);
1529 return DiskDeinit(disk);
1535 los_disk *disk = get_disk(drvID);
1536 if (disk == NULL) {
1540 DISK_LOCK(&disk->disk_mutex);
1541 if (disk->disk_status != STAT_INUSED) {
1542 DISK_UNLOCK(&disk->disk_mutex);
1547 if (disk->bcache != NULL) {
1548 ret = BlockCacheSync(disk->bcache);
1552 DISK_UNLOCK(&disk->disk_mutex);
1563 los_disk *disk = get_disk(drvID);
1564 if ((disk == NULL) || (sectorPerBlock == 0)) {
1577 DISK_LOCK(&disk->disk_mutex);
1579 if (disk->disk_status != STAT_INUSED) {
1583 if (disk->bcache != NULL) {
1584 ret = BlockCacheSync(disk->bcache);
1586 DISK_UNLOCK(&disk->disk_mutex);
1592 DiskCacheDeinit(disk);
1597 bc = BlockCacheInit(disk->dev, disk->sector_size, sectorPerBlock, blockNum, disk->sector_count / sectorPerBlock);
1600 DISK_UNLOCK(&disk->disk_mutex);
1608 disk->bcache = bc;
1610 DISK_UNLOCK(&disk->disk_mutex);
1614 DISK_UNLOCK(&disk->disk_mutex);
1621 static los_part *OsPartFind(los_disk *disk, const struct Vnode *blkDriver)
1625 DISK_LOCK(&disk->disk_mutex);
1626 if ((disk->disk_status != STAT_INUSED) || (LOS_ListEmpty(&disk->head) == TRUE)) {
1629 part = LOS_DL_LIST_ENTRY(disk->head.pstNext, los_part, list);
1630 if (disk->dev == blkDriver) {
1634 while (&part->list != &disk->head) {
1643 DISK_UNLOCK(&disk->disk_mutex);
1650 los_disk *disk = NULL;
1658 disk = get_disk(i);
1659 if (disk == NULL) {
1662 part = OsPartFind(disk, blkDriver);
1694 los_disk *disk = NULL;
1705 disk = get_disk((INT32)part->disk_id);
1706 if (disk == NULL) {
1710 DISK_LOCK(&disk->disk_mutex);
1711 if (disk->disk_status != STAT_INUSED) {
1727 DISK_UNLOCK(&disk->disk_mutex);
1731 DISK_UNLOCK(&disk->disk_mutex);
1774 PRINTK("disk id : %u\n", part->disk_id);
1776 PRINTK("part no in disk : %u\n", part->part_no_disk);
1791 los_disk *disk = get_disk((INT32)diskID);
1792 if (disk != NULL) {