On Fri, Jun 15, 2018 at 01:50:11PM -0700, Luis R. Rodriguez wrote: > Using raw zoned disks by filesystems requires special handling, only > f2fs currently supports this. All other filesystems do not support > dealing with zoned disks directly. > > As such using raw zoned disks is not supported by XFS, to use them you > need to use dm-zoned-tools, format them with dzadm, set the scheduler to > deadline, and then setup a dmsetup with zoned type, and somehow set > this up on every boot to live a semi-happy life for now. > > Even if you use dmsetup on every boot, the zoned disk is still exposed, > and a user may still think they have to run mkfs.xfs on it instead > of the /dev/mapper/ disk, and then mount it by mistake. > > In either case you may seem to believe your disk works and only eventually > end up with alignmet issues and perhaps lose you data. For instance: > > [10869.959501] device-mapper: zoned reclaim: (sda): Align zone 865 wp 28349 to 30842 (wp+2493) blocks failed -5 > [10870.014488] sd 0:0:0:0: [sda] tag#0 FAILED Result: hostbyte=DID_OK driverbyte=DRIVER_SENSE > [10870.016137] sd 0:0:0:0: [sda] tag#0 Sense Key : Illegal Request [current] > [10870.017696] sd 0:0:0:0: [sda] tag#0 Add. Sense: Unaligned write command > > We have to prevent these mistakes by avoiding mkfs.xfs use on zoned disks. > > Note that this not enough yet, if users are on old AHCI controllers, > the disks may not be detected as zoned. More work through udev may be > required to detect this situation old old parent PCI IDs for zoned > disks, and then prevent their use somehow. > > If you are stuck on using XFS there a udev rule out there [0], this is > far from perfect, and not fully what we want done upstream on Linux > distributions long term but it should at least help developers for now > enjoy their shiny big fat zoned disks with XFS. > > This check should help avoid having folks shoot themselves in the foot > for now with zoned disks. If you make the mistake to use mkfs.xfs > on a zoned disk, you will now get: > > # mkfs.xfs /dev/sda > /dev/sda: zoned disk detected, refer to dm-zoned-tools for how to use with XFS > > [0] https://lkml.kernel.org/r/20180614001147.1545-1-mcgrof@xxxxxxxxxx > > Cc: Damien Le Moal <damien.lemoal@xxxxxxx> > Cc: Bart Van Assche <Bart.VanAssche@xxxxxxx> > Signed-off-by: Luis R. Rodriguez <mcgrof@xxxxxxxxxx> > --- > libxfs/init.c | 41 +++++++++++++++++++++++++++++++++++++++++ > 1 file changed, 41 insertions(+) > > diff --git a/libxfs/init.c b/libxfs/init.c > index a65c86c3..cca33ec7 100644 > --- a/libxfs/init.c > +++ b/libxfs/init.c > @@ -98,6 +98,32 @@ libxfs_device_to_fd(dev_t device) > /* NOTREACHED */ > } > > +static int > +is_zoned_disk(char *path) > +{ > + char str[PATH_MAX]; > + char *devname = basename(path); > + FILE *file; > + int len; > + > + > + len = snprintf(str, sizeof(str), "/sys/block/%s/queue/zoned", devname); > + > + /* Indicates truncation */ > + if (len >= PATH_MAX) { > + errno = ENAMETOOLONG; > + return -1; > + } > + > + file = fopen(str, "r"); > + if (!file) > + return 0; > + Shouldn't we read the *file contents and return 0 if the contents are 'none'? $ lsscsi [0:0:0:0] disk ATA Samsung SSD 850 1B6Q /dev/sda $ cat /sys/block/sda/queue/zoned none --D > + fclose(file); > + > + return 1; > +} > + > /* libxfs_device_open: > * open a device and return its device number > */ > @@ -108,6 +134,7 @@ libxfs_device_open(char *path, int creat, int xflags, int setblksize) > int fd, d, flags; > int readonly, dio, excl; > struct stat statb; > + int ret; > > readonly = (xflags & LIBXFS_ISREADONLY); > excl = (xflags & LIBXFS_EXCLUSIVELY) && !creat; > @@ -119,6 +146,20 @@ retry: > (dio ? O_DIRECT : 0) | \ > (excl ? O_EXCL : 0); > > + ret = is_zoned_disk(path); > + if (ret < 0) { > + fprintf(stderr, _("%s: error opening %s\n"), > + path, strerror(errno)); > + exit(1); > + } > + > + if (ret == 1) { > + fprintf(stderr, > +_("%s: zoned disk detected, refer to dm-zoned-tools for how to use with XFS\n"), > + path); > + exit(1); > + } > + > if ((fd = open(path, flags, 0666)) < 0) { > if (errno == EINVAL && --dio == 0) > goto retry; > -- > 2.17.1 > > -- > To unsubscribe from this list: send the line "unsubscribe linux-xfs" in > the body of a message to majordomo@xxxxxxxxxxxxxxx > More majordomo info at http://vger.kernel.org/majordomo-info.html -- To unsubscribe from this list: send the line "unsubscribe linux-xfs" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html