Changeset 95ca19d in mainline


Ignore:
Timestamp:
2025-06-30T09:31:21Z (3 weeks ago)
Author:
Miroslav Cimerman <mc@…>
Children:
059885c
Parents:
640250b
Message:

hr: add —read-only volume flag

Location:
uspace
Files:
10 edited

Legend:

Unmodified
Added
Removed
  • uspace/app/hrctl/hrctl.c

    r640250b r95ca19d  
    5555static int create_from_argv(hr_t *, int, char **, uint8_t);
    5656static int handle_create(hr_t *, int, char **);
    57 static int assemble_from_config(hr_t *, const char *);
    58 static int assemble_from_argv(hr_t *, int, char **);
     57static int assemble_from_config(hr_t *, const char *, uint8_t);
     58static int assemble_from_argv(hr_t *, int, char **, uint8_t);
    5959static int handle_assemble(hr_t *, int, char **);
    6060static int handle_disassemble(hr_t *, int, char **);
     
    7070    "  -h, --help                                Display this message and exit.\n"
    7171    "\n"
    72     "  -c, --create [--no_meta]                  Create a volume, options:\n"
     72    "  -c, --create [--no-meta] [--read-only]    Create a volume, options:\n"
    7373    "      name {-l , --level level} device...   manual device specification, or\n"
    7474    "      -f configuration.sif                  create from configuration file.\n"
    7575    "\n"
    7676    "  -a, --assemble                            Assemble volume(s), options:\n"
    77     "      [device...]                           manual device specification, or\n"
    78     "      [-f configuration.sif]                assemble from configuration file, or\n"
     77    "      [[--read-only] device...]             manual device specification, or\n"
     78    "      [[--read-only] -f configuration.sif]  assemble from configuration file, or\n"
    7979    "                                            no option is automatic assembly.\n"
    8080    "\n"
     
    108108    "\n"
    109109    "Notes:\n"
    110     "  Add --no_meta after --create to disable storing on-disk metadata.\n"
     110    "  Add --no-meta after --create to disable storing on-disk metadata.\n"
    111111    "  Simulating an extent failure with -m volume -f index is dangerous. It marks\n"
    112112    "  metadata as dirty in other healthy extents, and zeroes out the superblock\n"
     
    445445}
    446446
     447static bool try_to_get_additional_flags(int argc, char **argv,
     448    uint8_t test_flags, uint8_t *flags)
     449{
     450        if (test_flags & HR_VOL_FLAG_NOOP_META) {
     451                if (str_cmp(argv[optind], "--no-meta") == 0) {
     452                        *flags |= HR_VOL_FLAG_NOOP_META;
     453                        optind++;
     454                        return true;
     455                }
     456        }
     457
     458        if (test_flags & HR_VOL_FLAG_READ_ONLY) {
     459                if (str_cmp(argv[optind], "--read-only") == 0) {
     460                        *flags |= HR_VOL_FLAG_READ_ONLY;
     461                        optind++;
     462                        return true;
     463                }
     464        }
     465
     466        return false;
     467}
     468
    447469static int handle_create(hr_t *hr, int argc, char **argv)
    448470{
    449471        int rc;
    450         uint8_t vol_flags = 0;
     472        uint8_t vflags = 0;
    451473
    452474        if (optind >= argc) {
     
    455477        }
    456478
    457         if (str_cmp(argv[optind], "--no_meta") == 0) {
    458                 vol_flags |= HR_VOL_FLAG_NOOP_META;
    459                 optind++;
    460         }
     479        uint8_t test_flags = HR_VOL_FLAG_NOOP_META | HR_VOL_FLAG_READ_ONLY;
     480        while (try_to_get_additional_flags(argc, argv, test_flags, &vflags))
     481                ;
    461482
    462483        if (str_cmp(argv[optind], "-f") == 0) {
     
    474495                }
    475496
    476                 rc = create_from_config(hr, config_path, vol_flags);
     497                rc = create_from_config(hr, config_path, vflags);
    477498        } else {
    478                 rc = create_from_argv(hr, argc, argv, vol_flags);
     499                rc = create_from_argv(hr, argc, argv, vflags);
    479500        }
    480501
     
    482503}
    483504
    484 static int assemble_from_config(hr_t *hr, const char *config_path)
     505static int assemble_from_config(hr_t *hr, const char *config_path,
     506    uint8_t vflags)
    485507{
    486508        hr_config_t *vol_configs = NULL;
     
    496518        for (size_t i = 0; i < vol_count; i++) {
    497519                size_t tmpcnt = 0;
     520                vol_configs[i].vol_flags = vflags;
    498521                (void)hr_assemble(hr, &vol_configs[i], &tmpcnt);
    499522                cnt += tmpcnt;
     
    506529}
    507530
    508 static int assemble_from_argv(hr_t *hr, int argc, char **argv)
     531static int assemble_from_argv(hr_t *hr, int argc, char **argv, uint8_t vflags)
    509532{
    510533        hr_config_t *vol_config = calloc(1, sizeof(hr_config_t));
     
    513536                return ENOMEM;
    514537        }
     538
     539        vol_config->vol_flags = vflags;
    515540
    516541        errno_t rc = fill_config_devs(argc, argv, vol_config);
     
    551576        }
    552577
     578        uint8_t vflags = 0;
     579        uint8_t test_flags = HR_VOL_FLAG_NOOP_META | HR_VOL_FLAG_READ_ONLY;
     580        while (try_to_get_additional_flags(argc, argv, test_flags, &vflags))
     581                ;
     582
     583        if (test_flags & HR_VOL_FLAG_NOOP_META)
     584                printf(NAME ": assembling, --no-meta flag will be ignored\n");
     585
    553586        if (str_cmp(argv[optind], "-f") == 0) {
    554587                if (++optind >= argc) {
     
    563596                }
    564597
    565                 rc = assemble_from_config(hr, config_path);
     598                rc = assemble_from_config(hr, config_path, vflags);
    566599        } else {
    567                 rc = assemble_from_argv(hr, argc, argv);
     600                rc = assemble_from_argv(hr, argc, argv, vflags);
    568601        }
    569602
     
    658691        printf("|   metadata type: %s\n",
    659692            hr_get_metadata_type_str(info->meta_type));
     693
     694        printf("|          vflags: ");
     695        for (size_t v = 0; v < HR_VOL_FLAG_COUNT; v++) {
     696                if (info->vflags & (1 << v)) {
     697                        printf("%s ",
     698                            hr_get_vol_flag_str(info->vflags & (1 << v)));
     699                }
     700        }
     701        printf("\n");
     702
    660703        printf("|           level: %s\n", hr_get_level_str(info->level));
    661704        if (info->layout != HR_LAYOUT_NONE)
  • uspace/lib/device/include/hr.h

    r640250b r95ca19d  
    9292} hr_metadata_type_t;
    9393
     94#define HR_VOL_FLAG_COUNT 2
    9495typedef enum hr_vol_flag {
    95         HR_VOL_FLAG_NOOP_META = 0x01
     96        HR_VOL_FLAG_NOOP_META = 0x01,
     97        HR_VOL_FLAG_READ_ONLY = 0x02
    9698} hr_vol_flag_t;
    9799
     
    133135        hr_layout_t layout;
    134136        hr_metadata_type_t meta_type;
    135         /* TODO: add rebuild pos */
     137        uint8_t vflags;
    136138} hr_vol_info_t;
    137139
     
    152154extern const char *hr_get_level_str(hr_level_t);
    153155extern const char *hr_get_metadata_type_str(hr_metadata_type_t);
     156extern const char *hr_get_vol_flag_str(hr_vol_flag_t);
    154157
    155158#endif
  • uspace/lib/device/src/hr.c

    r640250b r95ca19d  
    561561}
    562562
     563const char *hr_get_vol_flag_str(hr_vol_flag_t flag)
     564{
     565        switch (flag) {
     566        case HR_VOL_FLAG_NOOP_META:
     567                return "--no-meta";
     568        case HR_VOL_FLAG_READ_ONLY:
     569                return "--read-only";
     570        default:
     571                return "Invalid flag";
     572        }
     573}
     574
    563575/** @}
    564576 */
  • uspace/srv/bd/hr/hr.c

    r640250b r95ca19d  
    137137                meta_type = HR_METADATA_NATIVE;
    138138
    139         printf("creating with type %d\n", meta_type);
    140         rc = hr_create_vol_struct(&vol, cfg->level, cfg->devname, meta_type);
     139        rc = hr_create_vol_struct(&vol, cfg->level, cfg->devname, meta_type,
     140            cfg->vol_flags);
    141141        if (rc != EOK) {
    142142                free(cfg);
     
    531531        info.meta_type = vol->meta_ops->get_type();
    532532        memcpy(info.devname, vol->devname, HR_DEVNAME_LEN);
     533        info.vflags = vol->vflags;
    533534
    534535        if (!async_data_read_receive(&call, &size)) {
  • uspace/srv/bd/hr/raid0.c

    r640250b r95ca19d  
    256256                return EINVAL;
    257257
     258        if (vol->vflags & HR_VOL_FLAG_READ_ONLY && type == HR_BD_WRITE)
     259                return ENOTSUP;
     260
    258261        fibril_rwlock_read_lock(&vol->states_lock);
    259262        if (vol->state != HR_VOL_OPTIMAL) {
  • uspace/srv/bd/hr/raid1.c

    r640250b r95ca19d  
    278278        hr_volume_t *vol = bd->srvs->sarg;
    279279
     280        if (vol->vflags & HR_VOL_FLAG_READ_ONLY)
     281                return ENOTSUP;
     282
    280283        return hr_raid1_bd_op(HR_BD_WRITE, vol, ba, cnt, NULL, data, size);
    281284}
     
    455458        errno_t rc;
    456459
     460        if (vol->vflags & HR_VOL_FLAG_READ_ONLY)
     461                return ENOTSUP;
    457462        if (!(vol->meta_ops->get_flags() & HR_METADATA_ALLOW_REBUILD))
    458463                return ENOTSUP;
  • uspace/srv/bd/hr/raid5.c

    r640250b r95ca19d  
    384384                return EINVAL;
    385385
     386        if (vol->vflags & HR_VOL_FLAG_READ_ONLY)
     387                return ENOTSUP;
     388
    386389        fibril_rwlock_read_lock(&vol->states_lock);
    387390        hr_vol_state_t vol_state = vol->state;
     
    717720        void *buf = NULL, *xorbuf = NULL;
    718721
     722        if (vol->vflags & HR_VOL_FLAG_READ_ONLY)
     723                return ENOTSUP;
    719724        if (!(vol->meta_ops->get_flags() & HR_METADATA_ALLOW_REBUILD))
    720725                return ENOTSUP;
  • uspace/srv/bd/hr/util.c

    r640250b r95ca19d  
    6565    service_id_t, hr_metadata_type_t, void *);
    6666static errno_t hr_util_assemble_from_matching_list(list_t *,
    67     hr_metadata_type_t);
     67    hr_metadata_type_t, uint8_t);
    6868static errno_t hr_fill_svcs_list_from_cfg(hr_config_t *, list_t *);
    6969static errno_t hr_swap_hs(hr_volume_t *, size_t, size_t);
     
    102102
    103103errno_t hr_create_vol_struct(hr_volume_t **rvol, hr_level_t level,
    104     const char *devname, hr_metadata_type_t metadata_type)
     104    const char *devname, hr_metadata_type_t metadata_type, uint8_t vflags)
    105105{
    106106        HR_DEBUG("%s()", __func__);
     
    114114        str_cpy(vol->devname, HR_DEVNAME_LEN, devname);
    115115        vol->level = level;
     116
     117        vol->vflags = vflags;
    116118
    117119        vol->meta_ops = hr_get_meta_type_ops(metadata_type);
     
    831833
    832834static errno_t hr_util_assemble_from_matching_list(list_t *list,
    833     hr_metadata_type_t type)
     835    hr_metadata_type_t type, uint8_t vflags)
    834836{
    835837        HR_DEBUG("%s()", __func__);
     
    847849
    848850        hr_volume_t *vol;
    849         rc = hr_create_vol_struct(&vol, level, devname, type);
     851        rc = hr_create_vol_struct(&vol, level, devname, type, vflags);
    850852        if (rc != EOK)
    851853                return rc;
     
    913915        errno_t rc;
    914916        list_t dev_id_list;
     917        uint8_t vflags = 0;
    915918
    916919        list_initialize(&dev_id_list);
    917920
    918         if (cfg == NULL)
     921        if (cfg == NULL) {
    919922                rc = hr_fill_disk_part_svcs_list(&dev_id_list);
    920         else
     923        } else {
    921924                rc = hr_fill_svcs_list_from_cfg(cfg, &dev_id_list);
     925                vflags = cfg->vol_flags;
     926        }
    922927
    923928        if (rc != EOK)
     
    986991
    987992                rc = hr_util_assemble_from_matching_list(&matching_svcs_list,
    988                     type);
     993                    type, vflags);
    989994                switch (rc) {
    990995                case EOK:
  • uspace/srv/bd/hr/util.h

    r640250b r95ca19d  
    8484
    8585extern errno_t hr_create_vol_struct(hr_volume_t **, hr_level_t, const char *,
    86     hr_metadata_type_t);
     86    hr_metadata_type_t, uint8_t);
    8787extern void hr_destroy_vol_struct(hr_volume_t *);
    8888extern errno_t hr_get_volume_svcs(size_t *, service_id_t **);
  • uspace/srv/bd/hr/var.h

    r640250b r95ca19d  
    118118        _Atomic int open_cnt; /* open/close() counter */
    119119        hr_vol_state_t state; /* volume state */
     120        uint8_t vflags;
    120121} hr_volume_t;
    121122
Note: See TracChangeset for help on using the changeset viewer.