minor cleanups, improve error handling

gracefully handle UFS_BSG not being enabled in the kernel, rather than
putting the device into a semi-bricked state (oops).
merge-requests/7/head 0.1.1
Caleb Connolly 3 years ago
parent 487a96f663
commit 50ef0328af
No known key found for this signature in database
GPG Key ID: 0583312B195F64B6
  1. 5
      README.md
  2. 5
      bootctrl_impl.cpp
  3. 2
      gpt-utils.cpp
  4. 63
      ufs-bsg.cpp
  5. 7
      ufs-bsg.h

@ -39,3 +39,8 @@ qbootctl [-c|-m|-s|-u|-b|-n|-x] [SLOT]
## Debugging ## Debugging
Set `DEBUG` to 1 in `utils.h` to enable debug logging. Set `DEBUG` to 1 in `utils.h` to enable debug logging.
## Documentation
A more details explanation and a list of devices where qbootctl has been
validated can be found [on the postmarketOS wiki](https://wiki.postmarketos.org/wiki/Android_AB_Slots):

@ -33,6 +33,7 @@
#include "utils.h" #include "utils.h"
#include "gpt-utils.h" #include "gpt-utils.h"
#include "ufs-bsg.h"
#include "bootctrl.h" #include "bootctrl.h"
@ -607,6 +608,10 @@ int set_active_boot_slot(unsigned slot)
goto error; goto error;
} }
if (ufs_bsg_dev_open() < 0) {
goto error;
}
//The partition list just contains prefixes(without the _a/_b) of the //The partition list just contains prefixes(without the _a/_b) of the
//partitions that support A/B. In order to get the layout we need the //partitions that support A/B. In order to get the layout we need the
//actual names. To do this we append the slot suffix to every member //actual names. To do this we append the slot suffix to every member

@ -300,8 +300,6 @@ int gpt_utils_set_xbl_boot_partition(enum boot_chain chain)
LOGD("%s: setting %s lun as boot lun\n", __func__, boot_dev); LOGD("%s: setting %s lun as boot lun\n", __func__, boot_dev);
if (set_boot_lun(boot_lun_id)) { if (set_boot_lun(boot_lun_id)) {
fprintf(stderr, "%s: Failed to set xblbak as boot partition\n",
__func__);
goto error; goto error;
} }
return 0; return 0;

@ -45,52 +45,30 @@
#include "utils.h" #include "utils.h"
#include "ufs-bsg.h" #include "ufs-bsg.h"
// FIXME: replace this with something that actually works /* UFS BSG device node */
// static int get_ufs_bsg_dev(void) static char ufs_bsg_dev[FNAME_SZ] = "/dev/bsg/ufs-bsg0";
// {
// DIR *dir; static int fd_ufs_bsg = 0;
// struct dirent *ent;
// int ret = -ENODEV; int ufs_bsg_dev_open()
// if ((dir = opendir ("/dev")) != NULL) {
// /* read all the files and directories within directory */
// while ((ent = readdir(dir)) != NULL) {
// if (!strcmp(ent->d_name, "bsg") ||
// !strcmp(ent->d_name, "ufs-bsg0")) {
// snprintf(ufs_bsg_dev, FNAME_SZ, "/dev/%s", ent->d_name);
// ret = 0;
// break;
// }
// }
// if (ret)
// fprintf(stderr, "could not find the ufs-bsg dev\n");
// closedir (dir);
// } else {
// /* could not open directory */
// fprintf(stderr, "could not open /dev (error no: %d)\n", errno);
// ret = -EINVAL;
// }
// return ret;
// }
int ufs_bsg_dev_open(void)
{ {
int ret; if (fd_ufs_bsg)
if (!fd_ufs_bsg) { return 0;
fd_ufs_bsg = open(ufs_bsg_dev, O_RDWR);
ret = errno; fd_ufs_bsg = open(ufs_bsg_dev, O_RDWR);
if (fd_ufs_bsg < 0) { if (fd_ufs_bsg < 0) {
fprintf(stderr, "Unable to open %s (error no: %d)", fprintf(stderr, "Unable to open '%s': %s\n", ufs_bsg_dev,
ufs_bsg_dev, errno); strerror(errno));
fd_ufs_bsg = 0; fprintf(stderr,
return ret; "Is CONFIG_SCSI_UFS_BSG is enabled in your kernel?\n");
} fd_ufs_bsg = 0;
return -1;
} }
return 0; return 0;
} }
void ufs_bsg_dev_close(void) void ufs_bsg_dev_close()
{ {
if (fd_ufs_bsg) { if (fd_ufs_bsg) {
close(fd_ufs_bsg); close(fd_ufs_bsg);
@ -188,9 +166,6 @@ int32_t set_boot_lun(__u8 lun_id)
int32_t ret; int32_t ret;
__u32 boot_lun_id = lun_id; __u32 boot_lun_id = lun_id;
// ret = get_ufs_bsg_dev();
// if (ret)
// return ret;
LOGD("Using UFS bsg device: %s\n", ufs_bsg_dev); LOGD("Using UFS bsg device: %s\n", ufs_bsg_dev);
ret = ufs_bsg_dev_open(); ret = ufs_bsg_dev_open();

@ -36,11 +36,6 @@
#define DWORD(b3, b2, b1, b0) htobe32((b3 << 24) | (b2 << 16) | (b1 << 8) | b0) #define DWORD(b3, b2, b1, b0) htobe32((b3 << 24) | (b2 << 16) | (b1 << 8) | b0)
/* UFS BSG device node */
char ufs_bsg_dev[FNAME_SZ] = "/dev/bsg/ufs-bsg0";
int fd_ufs_bsg;
/* UPIU Transaction Codes */ /* UPIU Transaction Codes */
enum { enum {
UTP_UPIU_NOP_OUT = 0x00, UTP_UPIU_NOP_OUT = 0x00,
@ -91,4 +86,6 @@ enum query_attr_idn {
QUERY_ATTR_IDN_ACTIVE_ICC_LVL = 0x03, QUERY_ATTR_IDN_ACTIVE_ICC_LVL = 0x03,
}; };
int ufs_bsg_dev_open();
#endif /* __RECOVERY_UFS_BSG_H__ */ #endif /* __RECOVERY_UFS_BSG_H__ */

Loading…
Cancel
Save