2828
2929#include " virtiofs.hh"
3030#include " virtiofs_i.hh"
31- #include " drivers/virtio-fs.hh"
3231
3332static constexpr uint32_t OPEN_FLAGS = O_RDONLY;
3433
@@ -60,8 +59,8 @@ static int virtiofs_lookup(struct vnode* vnode, char* name, struct vnode** vpp)
6059 }
6160 strcpy (in_args.get (), name);
6261
63- auto * strategy = static_cast <fuse_strategy *>(vnode->v_mount ->m_data );
64- auto error = fuse_req_send_and_receive_reply (strategy , FUSE_LOOKUP,
62+ auto * drv = static_cast <virtio::fs *>(vnode->v_mount ->m_data );
63+ auto error = fuse_req_send_and_receive_reply (drv , FUSE_LOOKUP,
6564 inode->nodeid , in_args.get (), in_args_len, out_args.get (),
6665 sizeof (*out_args));
6766 if (error) {
@@ -111,8 +110,8 @@ static int virtiofs_open(struct file* fp)
111110 }
112111 in_args->flags = OPEN_FLAGS;
113112
114- auto * strategy = static_cast <fuse_strategy *>(vnode->v_mount ->m_data );
115- auto error = fuse_req_send_and_receive_reply (strategy , FUSE_OPEN,
113+ auto * drv = static_cast <virtio::fs *>(vnode->v_mount ->m_data );
114+ auto error = fuse_req_send_and_receive_reply (drv , FUSE_OPEN,
116115 inode->nodeid , in_args.get (), sizeof (*in_args), out_args.get (),
117116 sizeof (*out_args));
118117 if (error) {
@@ -146,8 +145,8 @@ static int virtiofs_close(struct vnode* vnode, struct file* fp)
146145 in_args->fh = f_data->file_handle ;
147146 in_args->flags = OPEN_FLAGS; // need to be same as in FUSE_OPEN
148147
149- auto * strategy = static_cast <fuse_strategy *>(vnode->v_mount ->m_data );
150- auto error = fuse_req_send_and_receive_reply (strategy , FUSE_RELEASE,
148+ auto * drv = static_cast <virtio::fs *>(vnode->v_mount ->m_data );
149+ auto error = fuse_req_send_and_receive_reply (drv , FUSE_RELEASE,
151150 inode->nodeid , in_args.get (), sizeof (*in_args), nullptr , 0 );
152151 if (error) {
153152 kprintf (" [virtiofs] inode %lld, close failed\n " , inode->nodeid );
@@ -173,8 +172,8 @@ static int virtiofs_readlink(struct vnode* vnode, struct uio* uio)
173172 return ENOMEM;
174173 }
175174
176- auto * strategy = static_cast <fuse_strategy *>(vnode->v_mount ->m_data );
177- auto error = fuse_req_send_and_receive_reply (strategy , FUSE_READLINK,
175+ auto * drv = static_cast <virtio::fs *>(vnode->v_mount ->m_data );
176+ auto error = fuse_req_send_and_receive_reply (drv , FUSE_READLINK,
178177 inode->nodeid , nullptr , 0 , link_path.get (), PATH_MAX);
179178 if (error) {
180179 kprintf (" [virtiofs] inode %lld, readlink failed\n " , inode->nodeid );
@@ -188,10 +187,9 @@ static int virtiofs_readlink(struct vnode* vnode, struct uio* uio)
188187
189188// Read @read_amt bytes from @inode, using the DAX window.
190189static int virtiofs_read_direct (virtiofs_inode& inode, u64 file_handle,
191- u64 read_amt, fuse_strategy& strategy , struct uio & uio)
190+ u64 read_amt, virtio::fs& drv , struct uio & uio)
192191{
193- auto * drv = static_cast <virtio::fs*>(strategy.drv );
194- auto * dax = drv->get_dax ();
192+ auto * dax = drv.get_dax ();
195193 // Enter the critical path: setup mapping -> read -> remove mapping
196194 std::lock_guard<mutex> guard {dax->lock };
197195
@@ -215,7 +213,7 @@ static int virtiofs_read_direct(virtiofs_inode& inode, u64 file_handle,
215213 uint64_t moffset = 0 ;
216214 in_args->moffset = moffset;
217215
218- auto map_align = drv-> get_map_alignment ();
216+ auto map_align = drv. get_map_alignment ();
219217 if (map_align < 0 ) {
220218 kprintf (" [virtiofs] inode %lld, map alignment not set\n " , inode.nodeid );
221219 return ENOTSUP;
@@ -239,7 +237,7 @@ static int virtiofs_read_direct(virtiofs_inode& inode, u64 file_handle,
239237 virtiofs_debug (" inode %lld, setting up mapping (foffset=%lld, len=%lld, "
240238 " moffset=%lld)\n " , inode.nodeid , in_args->foffset ,
241239 in_args->len , in_args->moffset );
242- auto error = fuse_req_send_and_receive_reply (&strategy , FUSE_SETUPMAPPING,
240+ auto error = fuse_req_send_and_receive_reply (&drv , FUSE_SETUPMAPPING,
243241 inode.nodeid , in_args.get (), sizeof (*in_args), nullptr , 0 );
244242 if (error) {
245243 kprintf (" [virtiofs] inode %lld, mapping setup failed\n " , inode.nodeid );
@@ -277,7 +275,7 @@ static int virtiofs_read_direct(virtiofs_inode& inode, u64 file_handle,
277275
278276 virtiofs_debug (" inode %lld, removing mapping (moffset=%lld, len=%lld)\n " ,
279277 inode.nodeid , r_one->moffset , r_one->len );
280- error = fuse_req_send_and_receive_reply (&strategy , FUSE_REMOVEMAPPING,
278+ error = fuse_req_send_and_receive_reply (&drv , FUSE_REMOVEMAPPING,
281279 inode.nodeid , r_in_args.get (), r_in_args_size, nullptr , 0 );
282280 if (error) {
283281 kprintf (" [virtiofs] inode %lld, mapping removal failed\n " ,
@@ -290,7 +288,7 @@ static int virtiofs_read_direct(virtiofs_inode& inode, u64 file_handle,
290288
291289// Read @read_amt bytes from @inode, using the fallback FUSE_READ mechanism.
292290static int virtiofs_read_fallback (virtiofs_inode& inode, u64 file_handle,
293- u32 read_amt, u32 flags, fuse_strategy& strategy , struct uio & uio)
291+ u32 read_amt, u32 flags, virtio::fs& drv , struct uio & uio)
294292{
295293 std::unique_ptr<fuse_read_in> in_args {new (std::nothrow) fuse_read_in ()};
296294 std::unique_ptr<void , std::function<void (void *)>> buf {
@@ -306,7 +304,7 @@ static int virtiofs_read_fallback(virtiofs_inode& inode, u64 file_handle,
306304
307305 virtiofs_debug (" inode %lld, reading %lld bytes at offset %lld\n " ,
308306 inode.nodeid , read_amt, uio.uio_offset );
309- auto error = fuse_req_send_and_receive_reply (&strategy , FUSE_READ,
307+ auto error = fuse_req_send_and_receive_reply (&drv , FUSE_READ,
310308 inode.nodeid , in_args.get (), sizeof (*in_args), buf.get (), read_amt);
311309 if (error) {
312310 kprintf (" [virtiofs] inode %lld, read failed\n " , inode.nodeid );
@@ -345,24 +343,23 @@ static int virtiofs_read(struct vnode* vnode, struct file* fp, struct uio* uio,
345343
346344 auto * inode = static_cast <virtiofs_inode*>(vnode->v_data );
347345 auto * file_data = static_cast <virtiofs_file_data*>(fp->f_data );
348- auto * strategy = static_cast <fuse_strategy *>(vnode->v_mount ->m_data );
346+ auto * drv = static_cast <virtio::fs *>(vnode->v_mount ->m_data );
349347
350348 // Total read amount is what they requested, or what is left
351349 auto read_amt = std::min<uint64_t >(uio->uio_resid ,
352350 inode->attr .size - uio->uio_offset );
353351
354- auto * drv = static_cast <virtio::fs*>(strategy->drv );
355352 if (drv->get_dax ()) {
356353 // Try to read from DAX
357354 if (!virtiofs_read_direct (*inode, file_data->file_handle , read_amt,
358- *strategy , *uio)) {
355+ *drv , *uio)) {
359356
360357 return 0 ;
361358 }
362359 }
363360 // DAX unavailable or failed, use fallback
364361 return virtiofs_read_fallback (*inode, file_data->file_handle , read_amt,
365- ioflag, *strategy , *uio);
362+ ioflag, *drv , *uio);
366363}
367364
368365static int virtiofs_readdir (struct vnode * vnode, struct file * fp,
0 commit comments