Re: [PATCH v3 01/19] block: Add PR callouts for read keys and reservation

Bart Van Assche
2022-11-02T22:50:55Z

On 10/26/22 16:19, Mike Christie wrote:
> +struct pr_keys {
> + u32 generation;
> + u32 num_keys;
> + u64 keys[];
> +};
> +
> +struct pr_held_reservation {
> + u64 key;
> + u32 generation;
> + enum pr_type type;
> +};
> +
> struct pr_ops {
> int (*pr_register)(struct block_device *bdev, u64 old_key, u64 new_key,
> u32 flags);
> @@ -14,6 +26,18 @@ struct pr_ops {
> int (*pr_preempt)(struct block_device *bdev, u64 old_key, u64 new_key,
> enum pr_type type, bool abort);
> int (*pr_clear)(struct block_device *bdev, u64 key);
> + /*
> + * pr_read_keys - Read the registered keys and return them in the
> + * pr_keys->keys array. The keys array will have been allocated at the
> + * end of the pr_keys struct and is keys_len bytes. If there are more
> + * keys than can fit in the array, success will still be returned and
> + * pr_keys->num_keys will reflect the total number of keys the device
> + * contains, so the caller can retry with a larger array.
> + */
> + int (*pr_read_keys)(struct block_device *bdev,
> + struct pr_keys *keys_info, u32 keys_len);
> + int (*pr_read_reservation)(struct block_device *bdev,
> + struct pr_held_reservation *rsv);
> };

Is there any pr_read_keys() implementation that won't have to divide
@keys_len by 8? How about leaving out that argument and making callers
store the number of elements in the keys[] array in the num_keys member
before calling pr_read_keys()?

Thanks,

Bart.