Skip to content

Commit 81559f7

Browse files
committed
Merge branch 'dev' into main
2 parents e7f120b + 0a8bd2c commit 81559f7

File tree

2 files changed

+19
-10
lines changed

2 files changed

+19
-10
lines changed

easy-fs/src/efs.rs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -112,8 +112,12 @@ impl EasyFileSystem {
112112

113113
pub fn root_inode(efs: &Arc<Mutex<Self>>) -> Inode {
114114
let block_device = Arc::clone(&efs.lock().block_device);
115+
// acquire efs lock temporarily
116+
let (block_id, block_offset) = efs.lock().get_disk_inode_pos(0);
117+
// release efs lock
115118
Inode::new(
116-
0,
119+
block_id,
120+
block_offset,
117121
Arc::clone(efs),
118122
block_device,
119123
)

easy-fs/src/vfs.rs

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -20,12 +20,13 @@ pub struct Inode {
2020
}
2121

2222
impl Inode {
23+
/// We should not acquire efs lock here.
2324
pub fn new(
24-
inode_id: u32,
25+
block_id: u32,
26+
block_offset: usize,
2527
fs: Arc<Mutex<EasyFileSystem>>,
2628
block_device: Arc<dyn BlockDevice>,
2729
) -> Self {
28-
let (block_id, block_offset) = fs.lock().get_disk_inode_pos(inode_id);
2930
Self {
3031
block_id: block_id as usize,
3132
block_offset,
@@ -74,12 +75,14 @@ impl Inode {
7475
}
7576

7677
pub fn find(&self, name: &str) -> Option<Arc<Inode>> {
77-
let _ = self.fs.lock();
78+
let fs = self.fs.lock();
7879
self.read_disk_inode(|disk_inode| {
7980
self.find_inode_id(name, disk_inode)
8081
.map(|inode_id| {
82+
let (block_id, block_offset) = fs.get_disk_inode_pos(inode_id);
8183
Arc::new(Self::new(
82-
inode_id,
84+
block_id,
85+
block_offset,
8386
self.fs.clone(),
8487
self.block_device.clone(),
8588
))
@@ -140,18 +143,20 @@ impl Inode {
140143
&self.block_device,
141144
);
142145
});
143-
// release efs lock manually because we will acquire it again in Inode::new
144-
drop(fs);
146+
147+
let (block_id, block_offset) = fs.get_disk_inode_pos(new_inode_id);
145148
// return inode
146149
Some(Arc::new(Self::new(
147-
new_inode_id,
150+
block_id,
151+
block_offset,
148152
self.fs.clone(),
149153
self.block_device.clone(),
150154
)))
155+
// release efs lock automatically by compiler
151156
}
152157

153158
pub fn ls(&self) -> Vec<String> {
154-
let _ = self.fs.lock();
159+
let _fs = self.fs.lock();
155160
self.read_disk_inode(|disk_inode| {
156161
let file_count = (disk_inode.size as usize) / DIRENT_SZ;
157162
let mut v: Vec<String> = Vec::new();
@@ -172,7 +177,7 @@ impl Inode {
172177
}
173178

174179
pub fn read_at(&self, offset: usize, buf: &mut [u8]) -> usize {
175-
let _ = self.fs.lock();
180+
let _fs = self.fs.lock();
176181
self.read_disk_inode(|disk_inode| {
177182
disk_inode.read_at(offset, buf, &self.block_device)
178183
})

0 commit comments

Comments
 (0)