Skip to content

Commit c80945e

Browse files
committed
feat(usb_mass_storage): mount as disk
1 parent e87d885 commit c80945e

File tree

4 files changed

+51
-18
lines changed

4 files changed

+51
-18
lines changed

internal/usbgadget/config.go

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -137,6 +137,26 @@ func (u *UsbGadget) GetPath(itemKey string) (string, error) {
137137
return joinPath(u.kvmGadgetPath, item.path), nil
138138
}
139139

140+
func (u *UsbGadget) OverrideGadgetConfig(itemKey string, itemAttr string, value string) (error, bool) {
141+
u.configLock.Lock()
142+
defer u.configLock.Unlock()
143+
144+
// get it as a pointer
145+
_, ok := u.configMap[itemKey]
146+
if !ok {
147+
return fmt.Errorf("config item %s not found", itemKey), false
148+
}
149+
150+
if u.configMap[itemKey].attrs[itemAttr] == value {
151+
return nil, false
152+
}
153+
154+
u.configMap[itemKey].attrs[itemAttr] = value
155+
u.log.Info().Str("itemKey", itemKey).Str("itemAttr", itemAttr).Str("value", value).Msg("overriding gadget config")
156+
157+
return nil, true
158+
}
159+
140160
func mountConfigFS() error {
141161
_, err := os.Stat(gadgetPath)
142162
// TODO: check if it's mounted properly

jsonrpc.go

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -523,10 +523,12 @@ type RPCHandler struct {
523523
func rpcSetMassStorageMode(mode string) (string, error) {
524524
logger.Info().Str("mode", mode).Msg("Setting mass storage mode")
525525
var cdrom bool
526-
if mode == "cdrom" {
526+
switch mode {
527+
case "cdrom":
527528
cdrom = true
528-
} else if mode != "file" {
529-
logger.Info().Str("mode", mode).Msg("Invalid mode provided")
529+
case "disk":
530+
cdrom = false
531+
default:
530532
return "", fmt.Errorf("invalid mode: %s", mode)
531533
}
532534

@@ -544,12 +546,12 @@ func rpcSetMassStorageMode(mode string) (string, error) {
544546
}
545547

546548
func rpcGetMassStorageMode() (string, error) {
547-
cdrom, err := getMassStorageMode()
549+
cdrom, err := getMassStorageCDROMEnabled()
548550
if err != nil {
549551
return "", fmt.Errorf("failed to get mass storage mode: %w", err)
550552
}
551553

552-
mode := "file"
554+
mode := "disk"
553555
if cdrom {
554556
mode = "cdrom"
555557
}

ui/src/routes/devices.$id.mount.tsx

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -414,7 +414,7 @@ function BrowserFileView({
414414
if (file?.name.endsWith(".iso")) {
415415
setUsbMode("CDROM");
416416
} else if (file?.name.endsWith(".img")) {
417-
setUsbMode("CDROM");
417+
setUsbMode("Disk");
418418
}
419419
};
420420

@@ -566,7 +566,7 @@ function UrlView({
566566
if (url.endsWith(".iso")) {
567567
setUsbMode("CDROM");
568568
} else if (url.endsWith(".img")) {
569-
setUsbMode("CDROM");
569+
setUsbMode("Disk");
570570
}
571571
}
572572

@@ -773,7 +773,7 @@ function DeviceFileView({
773773
if (file.name.endsWith(".iso")) {
774774
setUsbMode("CDROM");
775775
} else if (file.name.endsWith(".img")) {
776-
setUsbMode("CDROM");
776+
setUsbMode("Disk");
777777
}
778778
}
779779

@@ -1579,7 +1579,6 @@ function UsbModeSelector({
15791579
type="radio"
15801580
id="disk"
15811581
name="mountType"
1582-
disabled
15831582
checked={usbMode === "Disk"}
15841583
onChange={() => setUsbMode("Disk")}
15851584
className="h-3 w-3 border-slate-800/30 bg-white text-blue-700 transition-opacity focus:ring-blue-500 disabled:opacity-30 dark:bg-slate-800"
@@ -1588,9 +1587,6 @@ function UsbModeSelector({
15881587
<span className="text-sm font-medium leading-none text-slate-900 opacity-50 dark:text-white">
15891588
Disk
15901589
</span>
1591-
<div className="text-[10px] text-slate-500 dark:text-slate-400">
1592-
Coming soon
1593-
</div>
15941590
</div>
15951591
</label>
15961592
</div>

usb_mass_storage.go

Lines changed: 21 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -39,18 +39,29 @@ func setMassStorageImage(imagePath string) error {
3939
}
4040

4141
func setMassStorageMode(cdrom bool) error {
42-
massStorageFunctionPath, err := gadget.GetPath("mass_storage_lun0")
43-
if err != nil {
44-
return fmt.Errorf("failed to get mass storage path: %w", err)
42+
if gadget == nil {
43+
return fmt.Errorf("gadget is not initialized")
4544
}
4645

4746
mode := "0"
4847
if cdrom {
4948
mode = "1"
5049
}
51-
if err := writeFile(path.Join(massStorageFunctionPath, "lun.0", "cdrom"), mode); err != nil {
52-
return fmt.Errorf("failed to set cdrom mode: %w", err)
50+
51+
// override the config
52+
err, changed := gadget.OverrideGadgetConfig("mass_storage_lun0", "cdrom", mode)
53+
if err != nil {
54+
return fmt.Errorf("failed to override gadget config: %w", err)
55+
}
56+
if !changed {
57+
return nil
58+
}
59+
60+
// apply the changes
61+
if err := gadget.UpdateGadgetConfig(); err != nil {
62+
return fmt.Errorf("failed to write gadget config: %w", err)
5363
}
64+
5465
return nil
5566
}
5667

@@ -109,7 +120,7 @@ func rpcMountBuiltInImage(filename string) error {
109120
return mountImage(imagePath)
110121
}
111122

112-
func getMassStorageMode() (bool, error) {
123+
func getMassStorageCDROMEnabled() (bool, error) {
113124
massStorageFunctionPath, err := gadget.GetPath("mass_storage_lun0")
114125
if err != nil {
115126
return false, fmt.Errorf("failed to get mass storage path: %w", err)
@@ -193,6 +204,7 @@ func rpcMountWithHTTP(url string, mode VirtualMediaMode) error {
193204
virtualMediaStateMutex.Unlock()
194205
return fmt.Errorf("another virtual media is already mounted")
195206
}
207+
setMassStorageMode(mode == CDROM)
196208
httpRangeReader = httpreadat.New(url)
197209
n, err := httpRangeReader.Size()
198210
if err != nil {
@@ -239,6 +251,7 @@ func rpcMountWithWebRTC(filename string, size int64, mode VirtualMediaMode) erro
239251
Size: size,
240252
}
241253
virtualMediaStateMutex.Unlock()
254+
setMassStorageMode(mode == CDROM)
242255
logger.Debug().Interface("currentVirtualMediaState", currentVirtualMediaState).Msg("currentVirtualMediaState")
243256
logger.Debug().Msg("Starting nbd device")
244257
nbdDevice = NewNBDDevice()
@@ -270,6 +283,8 @@ func rpcMountWithStorage(filename string, mode VirtualMediaMode) error {
270283
return fmt.Errorf("another virtual media is already mounted")
271284
}
272285

286+
setMassStorageMode(mode == CDROM)
287+
273288
fullPath := filepath.Join(imagesFolder, filename)
274289
fileInfo, err := os.Stat(fullPath)
275290
if err != nil {

0 commit comments

Comments
 (0)