Changeset 8b863a62 in mainline for uspace/srv/fs/ext4fs/ext4fs_ops.c


Ignore:
Timestamp:
2014-04-16T17:14:06Z (11 years ago)
Author:
Vojtech Horky <vojtechhorky@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
f857e8b
Parents:
dba3e2c (diff), 70b570c (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the (diff) links above to see all the changes relative to each parent.
Message:

Merge mainline changes

File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/srv/fs/ext4fs/ext4fs_ops.c

    rdba3e2c r8b863a62  
    101101static bool ext4fs_is_file(fs_node_t *node);
    102102static service_id_t ext4fs_service_get(fs_node_t *node);
     103static int ext4fs_size_block(service_id_t, uint32_t *);
     104static int ext4fs_total_block_count(service_id_t, uint64_t *);
     105static int ext4fs_free_block_count(service_id_t, uint64_t *);
    103106
    104107/* Static variables */
     
    194197        }
    195198       
    196         list_foreach(instance_list, link) {
    197                 ext4fs_instance_t *tmp =
    198                     list_get_instance(link, ext4fs_instance_t, link);
    199                
     199        list_foreach(instance_list, link, ext4fs_instance_t, tmp) {
    200200                if (tmp->service_id == service_id) {
    201201                        *inst = tmp;
     
    259259        rc = ext4fs_node_get_core(rfn, eparent->instance, inode);
    260260        if (rc != EOK)
    261                 return rc;
    262        
     261                goto exit;
     262
     263exit:
     264        ;
     265
    263266        /* Destroy search result structure */
    264         return ext4_directory_destroy_result(&result);
     267        int const rc2 = ext4_directory_destroy_result(&result);
     268        return rc == EOK ? rc2 : rc;
    265269}
    266270
     
    836840        ext4fs_node_t *enode = EXT4FS_NODE(fn);
    837841        return enode->instance->service_id;
     842}
     843
     844int ext4fs_size_block(service_id_t service_id, uint32_t *size)
     845{
     846        ext4fs_instance_t *inst;
     847        int rc = ext4fs_instance_get(service_id, &inst);
     848        if (rc != EOK)
     849                return rc;
     850
     851        if (NULL == inst)
     852                return ENOENT;
     853
     854        ext4_superblock_t *sb = inst->filesystem->superblock;
     855        *size = ext4_superblock_get_block_size(sb);
     856
     857        return EOK;
     858}
     859
     860int ext4fs_total_block_count(service_id_t service_id, uint64_t *count)
     861{
     862        ext4fs_instance_t *inst;
     863        int rc = ext4fs_instance_get(service_id, &inst);
     864        if (rc != EOK)
     865                return rc;
     866
     867        if (NULL == inst)
     868                return ENOENT;
     869
     870        ext4_superblock_t *sb = inst->filesystem->superblock;
     871        *count = ext4_superblock_get_blocks_count(sb);
     872
     873        return EOK;
     874}
     875
     876int ext4fs_free_block_count(service_id_t service_id, uint64_t *count)
     877{
     878        ext4fs_instance_t *inst;
     879        int rc = ext4fs_instance_get(service_id, &inst);
     880        if (rc != EOK)
     881                return rc;
     882
     883        ext4_superblock_t *sb = inst->filesystem->superblock;
     884        *count = ext4_superblock_get_free_blocks_count(sb);
     885
     886        return EOK;
    838887}
    839888
     
    857906        .is_directory = ext4fs_is_directory,
    858907        .is_file = ext4fs_is_file,
    859         .service_get = ext4fs_service_get
     908        .service_get = ext4fs_service_get,
     909        .size_block = ext4fs_size_block,
     910        .total_block_count = ext4fs_total_block_count,
     911        .free_block_count = ext4fs_free_block_count
    860912};
    861913
     
    9541006        *lnkcnt = 1;
    9551007       
    956         ext4fs_node_put(root_node);
    957        
    958         return EOK;
     1008        return ext4fs_node_put(root_node);
    9591009}
    9601010
     
    10451095        }
    10461096       
    1047         ext4_filesystem_put_inode_ref(inode_ref);
    1048        
    1049         return rc;
     1097        int const rc2 = ext4_filesystem_put_inode_ref(inode_ref);
     1098       
     1099        return rc == EOK ? rc2 : rc;
    10501100}
    10511101
     
    12201270                memset(buffer, 0, bytes);
    12211271               
    1222                 async_data_read_finalize(callid, buffer, bytes);
     1272                rc = async_data_read_finalize(callid, buffer, bytes);
    12231273                *rbytes = bytes;
    12241274               
    12251275                free(buffer);
    1226                 return EOK;
     1276                return rc;
    12271277        }
    12281278       
     
    12361286       
    12371287        assert(offset_in_block + bytes <= block_size);
    1238         async_data_read_finalize(callid, block->data + offset_in_block, bytes);
     1288        rc = async_data_read_finalize(callid, block->data + offset_in_block, bytes);
     1289        if (rc != EOK) {
     1290                block_put(block);
     1291                return rc;
     1292        }
    12391293       
    12401294        rc = block_put(block);
     
    12681322        size_t len;
    12691323        if (!async_data_write_receive(&callid, &len)) {
    1270                 ext4fs_node_put(fn);
    1271                 async_answer_0(callid, EINVAL);
    1272                 return EINVAL;
     1324                rc = EINVAL;
     1325                async_answer_0(callid, rc);
     1326                goto exit;
    12731327        }
    12741328       
     
    12931347            &fblock);
    12941348        if (rc != EOK) {
    1295                 ext4fs_node_put(fn);
    12961349                async_answer_0(callid, rc);
    1297                 return rc;
     1350                goto exit;
    12981351        }
    12991352       
     
    13111364                                    &fblock, true);
    13121365                                if (rc != EOK) {
    1313                                         ext4fs_node_put(fn);
    13141366                                        async_answer_0(callid, rc);
    1315                                         return rc;
     1367                                        goto exit;
    13161368                                }
    13171369                        }
     
    13201372                            &fblock, false);
    13211373                        if (rc != EOK) {
    1322                                 ext4fs_node_put(fn);
    13231374                                async_answer_0(callid, rc);
    1324                                 return rc;
     1375                                goto exit;
    13251376                        }
    13261377                } else {
    13271378                        rc = ext4_balloc_alloc_block(inode_ref, &fblock);
    13281379                        if (rc != EOK) {
    1329                                 ext4fs_node_put(fn);
    13301380                                async_answer_0(callid, rc);
    1331                                 return rc;
     1381                                goto exit;
    13321382                        }
    13331383                       
     
    13361386                        if (rc != EOK) {
    13371387                                ext4_balloc_free_block(inode_ref, fblock);
    1338                                 ext4fs_node_put(fn);
    13391388                                async_answer_0(callid, rc);
    1340                                 return rc;
     1389                                goto exit;
    13411390                        }
    13421391                }
     
    13501399        rc = block_get(&write_block, service_id, fblock, flags);
    13511400        if (rc != EOK) {
    1352                 ext4fs_node_put(fn);
    13531401                async_answer_0(callid, rc);
    1354                 return rc;
     1402                goto exit;
    13551403        }
    13561404       
    13571405        if (flags == BLOCK_FLAGS_NOREAD)
    13581406                memset(write_block->data, 0, block_size);
    1359        
     1407
    13601408        rc = async_data_write_finalize(callid, write_block->data +
    13611409            (pos % block_size), bytes);
    13621410        if (rc != EOK) {
    1363                 ext4fs_node_put(fn);
    1364                 return rc;
    1365         }
    1366        
     1411                block_put(write_block);
     1412                goto exit;
     1413        }
     1414
    13671415        write_block->dirty = true;
    1368        
     1416
    13691417        rc = block_put(write_block);
    1370         if (rc != EOK) {
    1371                 ext4fs_node_put(fn);
    1372                 return rc;
    1373         }
    1374        
     1418        if (rc != EOK)
     1419                goto exit;
     1420
    13751421        /* Do some counting */
    13761422        uint32_t old_inode_size = ext4_inode_get_size(fs->superblock,
     
    13801426                inode_ref->dirty = true;
    13811427        }
    1382        
     1428
    13831429        *nsize = ext4_inode_get_size(fs->superblock, inode_ref->inode);
    13841430        *wbytes = bytes;
    1385        
    1386         return ext4fs_node_put(fn);
     1431
     1432exit:
     1433        ;
     1434
     1435        int const rc2 = ext4fs_node_put(fn);
     1436        return rc == EOK ? rc2 : rc;
    13871437}
    13881438
     
    14101460       
    14111461        rc = ext4_filesystem_truncate_inode(inode_ref, new_size);
    1412         ext4fs_node_put(fn);
    1413        
    1414         return rc;
     1462        int const rc2 = ext4fs_node_put(fn);
     1463       
     1464        return rc == EOK ? rc2 : rc;
    14151465}
    14161466
Note: See TracChangeset for help on using the changeset viewer.