On Sun, Mar 28, 2010 at 10:30:39PM +0100, M.S.Colclough wrote: > RAID probing of CD/DVD can yield errors because of well-known problem > in reading the end of the disk with some disk/drive combinations. > Borrow CD detection method from udev and skip the RAID tests for > these devices. Applied, thanks. I did some minor changes to the patch. See the committed version below. Karel >From 55113b15afe5f61fc917c22a9d8d47f89b37c757 Mon Sep 17 00:00:00 2001 From: M.S.Colclough <m.s.colclough@xxxxxxxxxx> Date: Wed, 31 Mar 2010 18:11:00 +0200 Subject: [PATCH] libblkid: avoid probing CDs for RAID RAID probing of CD/DVD can yield errors because of well-known problem in reading the end of the disk with some disk/drive combinations. Borrow CD detection method from udev and skip the RAID tests for these devices. [kzak@xxxxxxxxxx: - check for linux/cdrom.h in ./configure - add #ifdef around the ioctl call - call the ioctl for block devices only] Signed-off-by: Mark Colclough <m.s.colclough@xxxxxxxxxx> Signed-off-by: Karel Zak <kzak@xxxxxxxxxx> --- configure.ac | 1 + shlibs/blkid/src/blkidP.h | 2 ++ shlibs/blkid/src/probe.c | 16 ++++++++++++++++ shlibs/blkid/src/superblocks/superblocks.c | 5 +++++ 4 files changed, 24 insertions(+), 0 deletions(-) diff --git a/configure.ac b/configure.ac index 02777a8..121ac50 100644 --- a/configure.ac +++ b/configure.ac @@ -108,6 +108,7 @@ AC_CHECK_HEADERS( linux/tiocl.h \ linux/version.h \ linux/falloc.h \ + linux/cdrom.h \ fcntl.h \ locale.h \ stdint.h \ diff --git a/shlibs/blkid/src/blkidP.h b/shlibs/blkid/src/blkidP.h index db5da5e..b15c7f9 100644 --- a/shlibs/blkid/src/blkidP.h +++ b/shlibs/blkid/src/blkidP.h @@ -208,6 +208,7 @@ struct blkid_struct_probe /* flags */ #define BLKID_PRIVATE_FD (1 << 1) /* see blkid_new_probe_from_filename() */ #define BLKID_TINY_DEV (1 << 2) /* <= 1.47MiB (floppy or so) */ +#define BLKID_CDROM_DEV (1 << 3) /* is a CD/DVD drive */ /* * Evaluation methods (for blkid_eval_* API) @@ -369,6 +370,7 @@ extern void blkid_free_dev(blkid_dev dev); /* probe.c */ extern int blkid_probe_is_tiny(blkid_probe pr); +extern int blkid_probe_is_cdrom(blkid_probe pr); extern unsigned char *blkid_probe_get_buffer(blkid_probe pr, blkid_loff_t off, blkid_loff_t len); diff --git a/shlibs/blkid/src/probe.c b/shlibs/blkid/src/probe.c index ab1c8d5..3c6e694 100644 --- a/shlibs/blkid/src/probe.c +++ b/shlibs/blkid/src/probe.c @@ -77,6 +77,9 @@ #include <fcntl.h> #include <ctype.h> #include <sys/types.h> +#ifdef HAVE_LINUX_CDROM_H +#include <linux/cdrom.h> +#endif #ifdef HAVE_SYS_STAT_H #include <sys/stat.h> #endif @@ -545,6 +548,14 @@ int blkid_probe_is_tiny(blkid_probe pr) return pr && (pr->flags & BLKID_TINY_DEV); } +/* + * CDROMs may fail when probed for RAID (last sector problem) + */ +int blkid_probe_is_cdrom(blkid_probe pr) +{ + return pr && (pr->flags & BLKID_CDROM_DEV); +} + /** * blkid_probe_set_device: * @pr: probe @@ -570,6 +581,7 @@ int blkid_probe_set_device(blkid_probe pr, int fd, pr->flags &= ~BLKID_PRIVATE_FD; pr->flags &= ~BLKID_TINY_DEV; + pr->flags &= ~BLKID_CDROM_DEV; pr->fd = fd; pr->off = off; pr->size = 0; @@ -619,6 +631,10 @@ int blkid_probe_set_device(blkid_probe pr, int fd, if (pr->size <= 1440 * 1024 && !S_ISCHR(pr->mode)) pr->flags |= BLKID_TINY_DEV; +#ifdef CDROM_GET_CAPABILITY + if (S_ISBLK(pr->mode) && ioctl(fd, CDROM_GET_CAPABILITY, NULL) >= 0) + pr->flags |= BLKID_CDROM_DEV; +#endif return 0; err: DBG(DEBUG_LOWPROBE, diff --git a/shlibs/blkid/src/superblocks/superblocks.c b/shlibs/blkid/src/superblocks/superblocks.c index 05668e1..9c71597 100644 --- a/shlibs/blkid/src/superblocks/superblocks.c +++ b/shlibs/blkid/src/superblocks/superblocks.c @@ -343,6 +343,11 @@ static int superblocks_probe(blkid_probe pr, struct blkid_chain *chn) blkid_probe_is_tiny(pr)) continue; + /* don't probe for RAIDs, swap or journal on floppies or CD/DVDs */ + if ((id->usage & (BLKID_USAGE_RAID | BLKID_USAGE_OTHER)) && + (blkid_probe_is_tiny(pr) || blkid_probe_is_cdrom(pr))) + continue; + DBG(DEBUG_LOWPROBE, printf("[%d] %s:\n", i, id->name)); /* try to detect by magic string */ -- 1.6.6 -- To unsubscribe from this list: send the line "unsubscribe util-linux-ng" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html