Skip to content

Commit 69ee213

Browse files
authored
fix(container): improve sandbox runtime compatibility (#1981)
* fs: improve container mount filesystem semantics Signed-off-by: longjin <longjin@dragonos.org> * fix overlayfs open file semantics for containers Signed-off-by: longjin <longjin@dragonos.org> * fix(container): improve sandbox runtime compatibility Signed-off-by: longjin <longjin@dragonos.org> * fix(process): sync fork arch state through arch hook Signed-off-by: longjin <longjin@dragonos.org> * fix(mm): zap private COW mappings on truncate Signed-off-by: longjin <longjin@dragonos.org> * fix(tty): rebuild n_tty char map for canonical mode Signed-off-by: longjin <longjin@dragonos.org> * fix(process): harden fork publication ordering Signed-off-by: longjin <longjin@dragonos.org> * fix: apply staged compatibility updates Signed-off-by: longjin <longjin@dragonos.org> * fix(mm): defer file mmap publication until hook succeeds Signed-off-by: longjin <longjin@dragonos.org> * fix(fat): cache negative directory lookups Signed-off-by: longjin <longjin@dragonos.org> * docs: remove accidental PR documents Signed-off-by: longjin <longjin@dragonos.org> * fix(vfs): harden filesystem state transitions Signed-off-by: longjin <longjin@dragonos.org> * fix(ext4): wire xattr list and remove ops Signed-off-by: longjin <longjin@dragonos.org> --------- Signed-off-by: longjin <longjin@dragonos.org>
1 parent 956518d commit 69ee213

109 files changed

Lines changed: 14569 additions & 3569 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

kernel/crates/another_ext4/src/ext4/alloc.rs

Lines changed: 49 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,17 @@ use crate::prelude::*;
66
use crate::return_error;
77

88
impl Ext4 {
9+
fn restore_block_allocation_state(
10+
&self,
11+
bitmap_block: &Block,
12+
bg: &BlockGroupRef,
13+
sb: &SuperBlock,
14+
) -> Result<()> {
15+
self.write_block(bitmap_block)?;
16+
self.write_block_group_with_csum(&mut BlockGroupRef::new(bg.id, bg.desc))?;
17+
self.write_super_block(sb)
18+
}
19+
920
fn block_group_first_block(sb: &SuperBlock, bgid: BlockGroupId) -> PBlockId {
1021
bgid as PBlockId * sb.blocks_per_group() as PBlockId
1122
}
@@ -182,6 +193,9 @@ impl Ext4 {
182193
// extent physical block numbers are absolute filesystem block numbers.
183194
let bitmap_block_id = bg.desc.block_bitmap_block();
184195
let mut bitmap_block = self.read_block(bitmap_block_id)?;
196+
let old_bitmap_block = bitmap_block.clone();
197+
let old_bg = BlockGroupRef::new(bg.id, bg.desc);
198+
let old_sb = sb;
185199
let mut bitmap = Bitmap::new(&mut *bitmap_block.data, blocks_in_group);
186200

187201
let bit = match bitmap.find_and_set_first_clear_bit(0, blocks_in_group) {
@@ -197,11 +211,29 @@ impl Ext4 {
197211
// Update block group counters
198212
bg.desc
199213
.set_free_blocks_count(bg.desc.get_free_blocks_count() - 1);
200-
self.write_block_group_with_csum(&mut bg)?;
214+
if let Err(err) = self.write_block_group_with_csum(&mut bg) {
215+
return match self.restore_block_allocation_state(
216+
&old_bitmap_block,
217+
&old_bg,
218+
&old_sb,
219+
) {
220+
Ok(()) => Err(err),
221+
Err(rollback_err) => Err(rollback_err),
222+
};
223+
}
201224

202225
// Update superblock counters
203226
sb.set_free_blocks_count(sb.free_blocks_count() - 1);
204-
self.write_super_block(&sb)?;
227+
if let Err(err) = self.write_super_block(&sb) {
228+
return match self.restore_block_allocation_state(
229+
&old_bitmap_block,
230+
&old_bg,
231+
&old_sb,
232+
) {
233+
Ok(()) => Err(err),
234+
Err(rollback_err) => Err(rollback_err),
235+
};
236+
}
205237

206238
trace!("Alloc block {} ok", fblock);
207239
return Ok(fblock);
@@ -231,6 +263,9 @@ impl Ext4 {
231263
// Load block bitmap
232264
let bitmap_block_id = bg.desc.block_bitmap_block();
233265
let mut bitmap_block = self.read_block(bitmap_block_id)?;
266+
let old_bitmap_block = bitmap_block.clone();
267+
let old_bg = BlockGroupRef::new(bg.id, bg.desc);
268+
let old_sb = sb;
234269
let mut bitmap = Bitmap::new(&mut *bitmap_block.data, blocks_in_group);
235270

236271
// Free the block
@@ -245,11 +280,21 @@ impl Ext4 {
245280
// Update block group counters
246281
bg.desc
247282
.set_free_blocks_count(bg.desc.get_free_blocks_count() + 1);
248-
self.write_block_group_with_csum(&mut bg)?;
283+
if let Err(err) = self.write_block_group_with_csum(&mut bg) {
284+
return match self.restore_block_allocation_state(&old_bitmap_block, &old_bg, &old_sb) {
285+
Ok(()) => Err(err),
286+
Err(rollback_err) => Err(rollback_err),
287+
};
288+
}
249289

250290
// Update superblock counters
251291
sb.set_free_blocks_count(sb.free_blocks_count() + 1);
252-
self.write_super_block(&sb)?;
292+
if let Err(err) = self.write_super_block(&sb) {
293+
return match self.restore_block_allocation_state(&old_bitmap_block, &old_bg, &old_sb) {
294+
Ok(()) => Err(err),
295+
Err(rollback_err) => Err(rollback_err),
296+
};
297+
}
253298

254299
trace!("Free block {} ok", pblock);
255300
Ok(())

0 commit comments

Comments
 (0)