diff options
author | Coly Li <colyli@suse.de> | 2023-02-17 21:08:10 +0800 |
---|---|---|
committer | Coly Li <colyli@suse.de> | 2023-02-17 21:08:10 +0800 |
commit | a5e3753516bd39c431def86c8dfec8a9cea1ddd4 (patch) | |
tree | a6334f3a4ab3d17c7fdaee0f2d4d70a4c037c2ff | |
parent | 2499ff2dd78f236c7809016be5dfff836454396b (diff) | |
download | bcache-tools-master.tar.gz |
To check whether a block device is zoned or not, is_zoned_device()
returns true when /sys/block/<device>/queue/chunk_sectors is not zero.
Now there are devices which are not zoned devices but has non-zero
chunk-sectors values. For such situation, the more accurate method is
to read file /sys/block/<device>/queue/zoned. If the content is not
string "none", this device is not a zoned device. Otherwise (e.g.
"host-aware" or "host- managed"), it is a zoned device.
For elder kernel if the above sysfs file doesn't exist, get_zone_size()
is still called by is_zoned_device() for compatibility.
Signed-off-by: Coly Li <colyli@suse.de>
-rw-r--r-- | zoned.c | 19 |
1 files changed, 19 insertions, 0 deletions
@@ -90,5 +90,24 @@ void check_data_offset_for_zoned_device(char *devname, int is_zoned_device(char *devname) { + char str[128]; + FILE *file; + int res; + + snprintf(str, sizeof(str), + "/sys/block/%s/queue/zoned", + basename(devname)); + file = fopen(str, "r"); + if (file) { + memset(str, 0, sizeof(str)); + res = fscanf(file, "%s", str); + fclose(file); + + /* "none" indicates non-zoned device */ + if (res == 1) + return !(strcmp(str, "none") == 0); + } + + /* Only used when "zoned" file doesn't exist */ return (get_zone_size(devname) != 0); } |