: (bdev->ph_bsize - unalg);
r = bdev->bread(bdev, bdev->ph_bbuf, block_idx, 1);
-
if (r != EOK)
return r;
/*Aligned data*/
blen = len / bdev->ph_bsize;
r = bdev->bwrite(bdev, p, block_idx, blen);
-
if (r != EOK)
return r;
memcpy(bdev->ph_bbuf, p, len);
r = bdev->bwrite(bdev, bdev->ph_bbuf, block_idx, 1);
-
if (r != EOK)
return r;
}
blen = len / bdev->ph_bsize;
r = bdev->bread(bdev, p, block_idx, blen);
-
if (r != EOK)
return r;
if (!on_off && bdev->cache_write_back)
bdev->cache_write_back--;
+
+ if (bdev->cache_write_back)
+ return EOK;
+
/*Flush all delayed cache blocks*/
- if (!bdev->cache_write_back) {
- for (i = 0; i < bdev->bc->cnt; ++i) {
+ for (i = 0; i < bdev->bc->cnt; ++i) {
- /*Check if buffer free was delayed.*/
- if (!bdev->bc->free_delay[i])
- continue;
+ /*Check if buffer free was delayed.*/
+ if (!bdev->bc->free_delay[i])
+ continue;
- /*Check reference counter.*/
- if (bdev->bc->refctr[i])
- continue;
+ /*Check reference counter.*/
+ if (bdev->bc->refctr[i])
+ continue;
- /*Buffer free was delayed and have no reference. Flush
- * it.*/
- r = ext4_blocks_set_direct(
- bdev, bdev->bc->data + bdev->bc->itemsize * i,
- bdev->bc->lba[i], 1);
- if (r != EOK)
- return r;
+ /*Buffer free was delayed and have no reference. Flush
+ * it.*/
+ r = ext4_blocks_set_direct(bdev, bdev->bc->data +
+ bdev->bc->itemsize * i, bdev->bc->lba[i], 1);
+ if (r != EOK)
+ return r;
- /*No delayed anymore*/
- bdev->bc->free_delay[i] = 0;
+ /*No delayed anymore*/
+ bdev->bc->free_delay[i] = 0;
- /*Reduce reference counter*/
- bdev->bc->ref_blocks--;
- }
+ /*Reduce reference counter*/
+ bdev->bc->ref_blocks--;
}
+
return EOK;
}