2003-05-10 03:24:26

by Shane Shrybman

[permalink] [raw]
Subject: Can't find CDR device in -mm only

Hi,

The problem first appeared in 2.5.68-mm3 and is not in mainline 2.5.69.
It is present in all -mm releases since.

I have an IDE LG CDRW burner that has always worked fine both with
ide-scsi in 2.4 and without in 2.5. As can be seen in the inquiry out
put below the cdr device is not detected correctly by the -mm kernels.
It seems likely to be a kernel bug but I can't be certain.

Here is the inquiry output from cdrecord 2.0 from 2.5.69-mm3 which is
not working and 2.5.68-mm2 which is. I have straces of this too if that
would be useful. Same config was used for all kernels.

scsidev: '/dev/hdc'
devname: '/dev/hdc'
scsibus: -2 target: -2 lun: -2
scg__open(/dev/hdc) -2,-2,-2
Warning: Open by 'devname' is unintentional and not supported.
l1: 0x0 l2: 0x10
Bus: 0 Target: 0 Lun: 0 Chan: 0 Ino: 0
Linux sg driver version: 3.5.27
l1: 0x0 l2: 0x3
Bus: 0 Target: 0 Lun: 0 Chan: 0 Ino: 0
Target (0,0,0): DMA max 129024 old max: 64512
SCSI buffer size: 64512
Target (0,0,0): DMA max 129024 old max: 64512
scgo_getbuf: 64512 bytes
ioctl ret: 0
host_status: 00 driver_status: 00
ioctl ret: 0
host_status: 00 driver_status: 00
ioctl ret: 0
host_status: 00 driver_status: 00
dev: '/dev/hdc' speed: -1 fs: 4194304 driveropts '(NULL POINTER)'
Cdrecord 2.0 (i686-pc-linux-gnu) Copyright (C) 1995-2002 J?rg Schilling
TOC Type: 1 = CD-ROM
Using libscg version 'schily-0.7'
atapi: 1
Device type : Disk
Version : 2
Response Format: 2
Capabilities :
Vendor_info : 'ADAPTEC '
Identifikation : 'ACB-5500 '
Revision : 'FAKE'
Device seems to be: Adaptec 5500.

scsidev: '/dev/hdc'
devname: '/dev/hdc'
scsibus: -2 target: -2 lun: -2
scg__open(/dev/hdc) -2,-2,-2
Warning: Open by 'devname' is unintentional and not supported.
l1: 0x0 l2: 0x10
Bus: 0 Target: 0 Lun: 0 Chan: 0 Ino: 0
Linux sg driver version: 3.5.27
l1: 0x0 l2: 0x3
Bus: 0 Target: 0 Lun: 0 Chan: 0 Ino: 0
Target (0,0,0): DMA max 129024 old max: 64512
SCSI buffer size: 64512
Target (0,0,0): DMA max 129024 old max: 64512
scgo_getbuf: 64512 bytes
ioctl ret: 0
host_status: 00 driver_status: 00
ioctl ret: 0
host_status: 00 driver_status: 00
ioctl ret: 0
host_status: 00 driver_status: 00
ioctl ret: 0
host_status: 00 driver_status: 00
ioctl ret: 0
host_status: 00 driver_status: 00
ioctl ret: 0
host_status: 00 driver_status: 00
ioctl ret: 0
host_status: 00 driver_status: 00
ioctl ret: 0
host_status: 00 driver_status: 00
ioctl ret: 0
host_status: 00 driver_status: 00
ioctl ret: 0
host_status: 00 driver_status: 00
ioctl ret: 0
host_status: 00 driver_status: 00
ioctl ret: 0
host_status: 00 driver_status: 00
dev: '/dev/hdc' speed: -1 fs: 4194304 driveropts '(NULL POINTER)'
Cdrecord 2.0 (i686-pc-linux-gnu) Copyright (C) 1995-2002 J?rg Schilling
TOC Type: 1 = CD-ROM
Using libscg version 'schily-0.7'
atapi: 1
Device type : Removable CD-ROM
Version : 2
Response Format: 2
Capabilities :
Vendor_info : 'LG '
Identifikation : 'CD-RW CED-8120B '
Revision : '1.03'
Device seems to be: Generic mmc CD-RW.

Regards,

Shane


2003-05-10 03:28:31

by Andrew Morton

[permalink] [raw]
Subject: Re: Can't find CDR device in -mm only

Shane Shrybman <[email protected]> wrote:
>
> The problem first appeared in 2.5.68-mm3 and is not in mainline 2.5.69.
> It is present in all -mm releases since.

Could you try reverting the 64-bit dev_t patch? Do a `patch -p1 -R'
of the below. Thanks.


diff -puN drivers/s390/block/dasd_int.h~64-bit-dev_t-kdev_t drivers/s390/block/dasd_int.h
--- 25/drivers/s390/block/dasd_int.h~64-bit-dev_t-kdev_t 2003-05-03 15:06:44.000000000 -0700
+++ 25-akpm/drivers/s390/block/dasd_int.h 2003-05-03 15:06:44.000000000 -0700
@@ -14,7 +14,8 @@

#ifdef __KERNEL__

-#define DASD_PER_MAJOR ( 1U<<(MINORBITS-DASD_PARTN_BITS))
+#define DASD_MINORBITS 8
+#define DASD_PER_MAJOR ( 1U<<(DASD_MINORBITS-DASD_PARTN_BITS))
#define DASD_PARTN_MASK ((1 << DASD_PARTN_BITS) - 1)

/*
diff -puN drivers/scsi/sg.c~64-bit-dev_t-kdev_t drivers/scsi/sg.c
--- 25/drivers/scsi/sg.c~64-bit-dev_t-kdev_t 2003-05-03 15:06:44.000000000 -0700
+++ 25-akpm/drivers/scsi/sg.c 2003-05-03 15:06:44.000000000 -0700
@@ -80,7 +80,7 @@ static void sg_proc_cleanup(void);
#define SG_ALLOW_DIO_DEF 0
#define SG_ALLOW_DIO_CODE /* compile out by commenting this define */

-#define SG_MAX_DEVS_MASK ((1U << KDEV_MINOR_BITS) - 1)
+#define SG_MAX_DEVS_MASK 255

/*
* Suppose you want to calculate the formula muldiv(x,m,d)=int(x * m / d)
@@ -1331,8 +1331,8 @@ static ssize_t
sg_device_kdev_read(struct device *driverfs_dev, char *page)
{
Sg_device *sdp = list_entry(driverfs_dev, Sg_device, sg_driverfs_dev);
- return sprintf(page, "%x\n", MKDEV(sdp->disk->major,
- sdp->disk->first_minor));
+ dev_t dev = MKDEV(sdp->disk->major, sdp->disk->first_minor);
+ return sprintf(page, "%llx\n", (unsigned long long) dev);
}
static DEVICE_ATTR(kdev,S_IRUGO,sg_device_kdev_read,NULL);

diff -puN drivers/scsi/sr.c~64-bit-dev_t-kdev_t drivers/scsi/sr.c
--- 25/drivers/scsi/sr.c~64-bit-dev_t-kdev_t 2003-05-03 15:06:44.000000000 -0700
+++ 25-akpm/drivers/scsi/sr.c 2003-05-03 15:06:44.000000000 -0700
@@ -56,7 +56,7 @@
MODULE_PARM(xa_test, "i"); /* see sr_ioctl.c */


-#define SR_DISKS (1 << KDEV_MINOR_BITS)
+#define SR_DISKS 256

#define MAX_RETRIES 3
#define SR_TIMEOUT (30 * HZ)
diff -puN fs/xfs/linux/xfs_super.c~64-bit-dev_t-kdev_t fs/xfs/linux/xfs_super.c
--- 25/fs/xfs/linux/xfs_super.c~64-bit-dev_t-kdev_t 2003-05-03 15:06:44.000000000 -0700
+++ 25-akpm/fs/xfs/linux/xfs_super.c 2003-05-03 15:06:44.000000000 -0700
@@ -251,8 +251,8 @@ xfs_setsize_buftarg(

if (set_blocksize(btp->pbr_bdev, sectorsize)) {
printk(KERN_WARNING
- "XFS: Cannot set_blocksize to %u on device 0x%x\n",
- sectorsize, btp->pbr_dev);
+ "XFS: Cannot set_blocksize to %u on device 0x%llx\n",
+ sectorsize, (unsigned long long) btp->pbr_dev);
}
}

diff -puN include/asm-i386/posix_types.h~64-bit-dev_t-kdev_t include/asm-i386/posix_types.h
--- 25/include/asm-i386/posix_types.h~64-bit-dev_t-kdev_t 2003-05-03 15:06:44.000000000 -0700
+++ 25-akpm/include/asm-i386/posix_types.h 2003-05-03 15:06:44.000000000 -0700
@@ -7,7 +7,9 @@
* assume GCC is being used.
*/

-typedef unsigned short __kernel_dev_t;
+#ifdef __GNUC__
+typedef unsigned long long __kernel_dev_t;
+#endif
typedef unsigned long __kernel_ino_t;
typedef unsigned short __kernel_mode_t;
typedef unsigned short __kernel_nlink_t;
diff -puN include/linux/kdev_t.h~64-bit-dev_t-kdev_t include/linux/kdev_t.h
--- 25/include/linux/kdev_t.h~64-bit-dev_t-kdev_t 2003-05-03 15:06:44.000000000 -0700
+++ 25-akpm/include/linux/kdev_t.h 2003-05-03 15:06:44.000000000 -0700
@@ -1,82 +1,14 @@
#ifndef _LINUX_KDEV_T_H
#define _LINUX_KDEV_T_H
#ifdef __KERNEL__
-/*
-As a preparation for the introduction of larger device numbers,
-we introduce a type kdev_t to hold them. No information about
-this type is known outside of this include file.
-
-Objects of type kdev_t designate a device. Outside of the kernel
-the corresponding things are objects of type dev_t - usually an
-integral type with the device major and minor in the high and low
-bits, respectively. Conversion is done by
-
-extern kdev_t to_kdev_t(int);
-
-It is up to the various file systems to decide how objects of type
-dev_t are stored on disk.
-The only other point of contact between kernel and outside world
-are the system calls stat and mknod, new versions of which will
-eventually have to be used in libc.
-
-[Unfortunately, the floppy control ioctls fail to hide the internal
-kernel structures, and the fd_device field of a struct floppy_drive_struct
-is user-visible. So, it remains a dev_t for the moment, with some ugly
-conversions in floppy.c.]
-
-Inside the kernel, we aim for a kdev_t type that is a pointer
-to a structure with information about the device (like major,
-minor, size, blocksize, sectorsize, name, read-only flag,
-struct file_operations etc.).
-
-However, for the time being we let kdev_t be almost the same as dev_t:
-
-typedef struct { unsigned short major, minor; } kdev_t;
-
-Admissible operations on an object of type kdev_t:
-- passing it along
-- comparing it for equality with another such object
-- storing it in inode->i_rdev or tty->device
-- using its bit pattern as argument in a hash function
-- finding its major and minor
-- complaining about it
-
-An object of type kdev_t is created only by the function MKDEV(),
-with the single exception of the constant 0 (no device).
-
-Right now the other information mentioned above is usually found
-in static arrays indexed by major or major,minor.
-
-An obstacle to immediately using
- typedef struct { ... (* lots of information *) } *kdev_t
-is the case of mknod used to create a block device that the
-kernel doesn't know about at present (but first learns about
-when some module is inserted).
-
-aeb - 950811
-*/

+#include <linux/types.h> /* for dev_t */

-/*
- * NOTE NOTE NOTE!
- *
- * The kernel-internal "kdev_t" will eventually have
- * 20 bits for minor numbers, and 12 bits for majors.
- *
- * HOWEVER, the external representation is still 8+8
- * bits, and there is no way to generate the extended
- * "kdev_t" format yet. Which is just as well, since
- * we still use "minor" as an index into various
- * static arrays, and they are sized for a 8-bit index.
- */
typedef struct {
- unsigned short value;
+ unsigned long long value;
} kdev_t;

-#define KDEV_MINOR_BITS 8
-#define KDEV_MAJOR_BITS 8
-
-#define __mkdev(major,minor) (((major) << KDEV_MINOR_BITS) + (minor))
+#define __mkdev(major, minor) (((unsigned long long)(major) << 32) + (minor))

#define mk_kdev(major, minor) ((kdev_t) { __mkdev(major,minor) } )

@@ -85,12 +17,12 @@ typedef struct {
* internal equality comparisons and for things
* like NFS filehandle conversion.
*/
-static inline unsigned int kdev_val(kdev_t dev)
+static inline unsigned long long kdev_val(kdev_t dev)
{
return dev.value;
}

-static inline kdev_t val_to_kdev(unsigned int val)
+static inline kdev_t val_to_kdev(unsigned long long val)
{
kdev_t dev;
dev.value = val;
@@ -107,30 +39,68 @@ static inline int kdev_same(kdev_t dev1,

#define kdev_none(d1) (!kdev_val(d1))

-/* Mask off the high bits for now.. */
-#define minor(dev) ((dev).value & 0xff)
-#define major(dev) (((dev).value >> KDEV_MINOR_BITS) & 0xff)
+#define minor(dev) (unsigned int)((dev).value & 0xffffffff)
+#define major(dev) (unsigned int)((dev).value >> 32)

/* These are for user-level "dev_t" */
-#define MINORBITS 8
-#define MINORMASK ((1U << MINORBITS) - 1)
+/* Going back and forth between dev and (ma,mi) is one-to-one
+ provided ma is nonzero or ma is zero and mi is 8-bit only.
+ Never use major 0 together with a minor larger than 255. */
+#if 0
+/* readable versions */
+static inline unsigned int
+MAJOR(dev_t dev) {
+ return (dev & ~0xffffffffULL) ? (dev >> 32) :
+ (dev & ~0xffff) ? (dev >> 16) : (dev >> 8);
+}
+
+static inline unsigned int
+MINOR(dev_t dev) {
+ return (dev & ~0xffffffffULL) ? (dev & 0xffffffff) :
+ (dev & ~0xffff) ? (dev & 0xffff) : (dev & 0xff);
+}

-#define MAJOR(dev) ((unsigned int) ((dev) >> MINORBITS))
-#define MINOR(dev) ((unsigned int) ((dev) & MINORMASK))
-#define MKDEV(ma,mi) (((ma) << MINORBITS) | (mi))
+static inline dev_t
+MKDEV(unsigned int major, unsigned int minor) {
+ unsigned int both = (major | minor);
+ return ((both & ~0xffff) ? (((dev_t) major) << 32) :
+ (both & ~0xff) ? (((dev_t) major) << 16) :
+ (((dev_t) major) << 8) ) | minor;
+}
+#else
+/* ugly macro versions */
+#define MAJOR(dev) ((unsigned int)({ dev_t __dev = dev; \
+ (__dev & ~0xffffffffULL) ? (__dev >> 32) : \
+ (__dev & ~0xffff) ? (__dev >> 16) : (__dev >> 8); }))
+#define MINOR(dev) ((unsigned int)({ dev_t __dev = dev; \
+ (__dev & ~0xffffffffULL) ? (__dev & 0xffffffff) : \
+ (__dev & ~0xffff) ? (__dev & 0xffff) : (__dev & 0xff); }))
+#define constant_MKDEV(ma, mi) \
+ ((((ma)|(mi)) & ~0xffff) ? ((ma) << 32) | (mi) : \
+ (((ma)|(mi)) & ~0xff) ? ((ma) << 16) | (mi) : ((ma) << 8) | (mi))
+#define MKDEV(major, minor) ({ \
+ unsigned int __ma = major, __mi = minor, __both = (__ma | __mi); \
+ ((sizeof(dev_t) > 4 && (__both & ~0xffff)) ? (((dev_t) __ma) << 32) : \
+ (__both & ~0xff) ? (((dev_t) __ma) << 16) : (((dev_t) __ma) << 8) \
+ ) | __mi; })
+#endif

/*
* Conversion functions
*/

-static inline int kdev_t_to_nr(kdev_t dev)
+static inline dev_t kdev_t_to_nr(kdev_t dev)
{
- return MKDEV(major(dev), minor(dev));
+ unsigned int ma = major(dev);
+ unsigned int mi = minor(dev);
+ return MKDEV(ma, mi);
}

-static inline kdev_t to_kdev_t(int dev)
+static inline kdev_t to_kdev_t(dev_t dev)
{
- return mk_kdev(MAJOR(dev),MINOR(dev));
+ unsigned int ma = MAJOR(dev);
+ unsigned int mi = MINOR(dev);
+ return mk_kdev(ma, mi);
}

#else /* __KERNEL__ */
@@ -138,6 +108,7 @@ static inline kdev_t to_kdev_t(int dev)
/*
Some programs want their definitions of MAJOR and MINOR and MKDEV
from the kernel sources. These must be the externally visible ones.
+Of course such programs should be updated.
*/
#define MAJOR(dev) ((dev)>>8)
#define MINOR(dev) ((dev) & 0xff)
diff -puN include/linux/raid/md_k.h~64-bit-dev_t-kdev_t include/linux/raid/md_k.h
--- 25/include/linux/raid/md_k.h~64-bit-dev_t-kdev_t 2003-05-03 15:06:44.000000000 -0700
+++ 25-akpm/include/linux/raid/md_k.h 2003-05-03 15:06:44.000000000 -0700
@@ -64,11 +64,7 @@ static inline int level_to_pers (int lev
typedef struct mddev_s mddev_t;
typedef struct mdk_rdev_s mdk_rdev_t;

-#if (MINORBITS != 8)
-#error MD does not handle bigger kdev yet
-#endif
-
-#define MAX_MD_DEVS (1<<MINORBITS) /* Max number of md dev */
+#define MAX_MD_DEVS 256 /* Max number of md dev */

/*
* options passed in raidrun:
diff -puN include/linux/root_dev.h~64-bit-dev_t-kdev_t include/linux/root_dev.h
--- 25/include/linux/root_dev.h~64-bit-dev_t-kdev_t 2003-05-03 15:06:44.000000000 -0700
+++ 25-akpm/include/linux/root_dev.h 2003-05-03 15:06:44.000000000 -0700
@@ -1,18 +1,16 @@
#ifndef _ROOT_DEV_H_
#define _ROOT_DEV_H_

-enum {
- Root_NFS = MKDEV(UNNAMED_MAJOR, 255),
- Root_RAM0 = MKDEV(RAMDISK_MAJOR, 0),
- Root_RAM1 = MKDEV(RAMDISK_MAJOR, 1),
- Root_FD0 = MKDEV(FLOPPY_MAJOR, 0),
- Root_HDA1 = MKDEV(IDE0_MAJOR, 1),
- Root_HDA2 = MKDEV(IDE0_MAJOR, 2),
- Root_SDA1 = MKDEV(SCSI_DISK0_MAJOR, 1),
- Root_SDA2 = MKDEV(SCSI_DISK0_MAJOR, 2),
- Root_HDC1 = MKDEV(IDE1_MAJOR, 1),
- Root_SR0 = MKDEV(SCSI_CDROM_MAJOR, 0),
-};
+#define Root_NFS MKDEV(UNNAMED_MAJOR, 255)
+#define Root_RAM0 MKDEV(RAMDISK_MAJOR, 0)
+#define Root_RAM1 MKDEV(RAMDISK_MAJOR, 1)
+#define Root_FD0 MKDEV(FLOPPY_MAJOR, 0)
+#define Root_HDA1 MKDEV(IDE0_MAJOR, 1)
+#define Root_HDA2 MKDEV(IDE0_MAJOR, 2)
+#define Root_SDA1 MKDEV(SCSI_DISK0_MAJOR, 1)
+#define Root_SDA2 MKDEV(SCSI_DISK0_MAJOR, 2)
+#define Root_HDC1 MKDEV(IDE1_MAJOR, 1)
+#define Root_SR0 MKDEV(SCSI_CDROM_MAJOR, 0)

extern dev_t ROOT_DEV;


_

2003-05-10 03:38:10

by Shane Shrybman

[permalink] [raw]
Subject: Re: Can't find CDR device in -mm only

Thats already backed out due to LVM issues.

On Fri, 2003-05-09 at 23:41, Andrew Morton wrote:
> Shane Shrybman <[email protected]> wrote:
> >
> > The problem first appeared in 2.5.68-mm3 and is not in mainline 2.5.69.
> > It is present in all -mm releases since.
>
> Could you try reverting the 64-bit dev_t patch? Do a `patch -p1 -R'
> of the below. Thanks.
>
>
> diff -puN drivers/s390/block/dasd_int.h~64-bit-dev_t-kdev_t drivers/s390/block/dasd_int.h
> --- 25/drivers/s390/block/dasd_int.h~64-bit-dev_t-kdev_t 2003-05-03 15:06:44.000000000 -0700
> +++ 25-akpm/drivers/s390/block/dasd_int.h 2003-05-03 15:06:44.000000000 -0700
> @@ -14,7 +14,8 @@
>
> #ifdef __KERNEL__
>
> -#define DASD_PER_MAJOR ( 1U<<(MINORBITS-DASD_PARTN_BITS))
> +#define DASD_MINORBITS 8
> +#define DASD_PER_MAJOR ( 1U<<(DASD_MINORBITS-DASD_PARTN_BITS))
> #define DASD_PARTN_MASK ((1 << DASD_PARTN_BITS) - 1)
>
> /*
> diff -puN drivers/scsi/sg.c~64-bit-dev_t-kdev_t drivers/scsi/sg.c
> --- 25/drivers/scsi/sg.c~64-bit-dev_t-kdev_t 2003-05-03 15:06:44.000000000 -0700
> +++ 25-akpm/drivers/scsi/sg.c 2003-05-03 15:06:44.000000000 -0700
> @@ -80,7 +80,7 @@ static void sg_proc_cleanup(void);
> #define SG_ALLOW_DIO_DEF 0
> #define SG_ALLOW_DIO_CODE /* compile out by commenting this define */
>
> -#define SG_MAX_DEVS_MASK ((1U << KDEV_MINOR_BITS) - 1)
> +#define SG_MAX_DEVS_MASK 255
>
> /*
> * Suppose you want to calculate the formula muldiv(x,m,d)=int(x * m / d)
> @@ -1331,8 +1331,8 @@ static ssize_t
> sg_device_kdev_read(struct device *driverfs_dev, char *page)
> {
> Sg_device *sdp = list_entry(driverfs_dev, Sg_device, sg_driverfs_dev);
> - return sprintf(page, "%x\n", MKDEV(sdp->disk->major,
> - sdp->disk->first_minor));
> + dev_t dev = MKDEV(sdp->disk->major, sdp->disk->first_minor);
> + return sprintf(page, "%llx\n", (unsigned long long) dev);
> }
> static DEVICE_ATTR(kdev,S_IRUGO,sg_device_kdev_read,NULL);
>
> diff -puN drivers/scsi/sr.c~64-bit-dev_t-kdev_t drivers/scsi/sr.c
> --- 25/drivers/scsi/sr.c~64-bit-dev_t-kdev_t 2003-05-03 15:06:44.000000000 -0700
> +++ 25-akpm/drivers/scsi/sr.c 2003-05-03 15:06:44.000000000 -0700
> @@ -56,7 +56,7 @@
> MODULE_PARM(xa_test, "i"); /* see sr_ioctl.c */
>
>
> -#define SR_DISKS (1 << KDEV_MINOR_BITS)
> +#define SR_DISKS 256
>
> #define MAX_RETRIES 3
> #define SR_TIMEOUT (30 * HZ)
> diff -puN fs/xfs/linux/xfs_super.c~64-bit-dev_t-kdev_t fs/xfs/linux/xfs_super.c
> --- 25/fs/xfs/linux/xfs_super.c~64-bit-dev_t-kdev_t 2003-05-03 15:06:44.000000000 -0700
> +++ 25-akpm/fs/xfs/linux/xfs_super.c 2003-05-03 15:06:44.000000000 -0700
> @@ -251,8 +251,8 @@ xfs_setsize_buftarg(
>
> if (set_blocksize(btp->pbr_bdev, sectorsize)) {
> printk(KERN_WARNING
> - "XFS: Cannot set_blocksize to %u on device 0x%x\n",
> - sectorsize, btp->pbr_dev);
> + "XFS: Cannot set_blocksize to %u on device 0x%llx\n",
> + sectorsize, (unsigned long long) btp->pbr_dev);
> }
> }
>
> diff -puN include/asm-i386/posix_types.h~64-bit-dev_t-kdev_t include/asm-i386/posix_types.h
> --- 25/include/asm-i386/posix_types.h~64-bit-dev_t-kdev_t 2003-05-03 15:06:44.000000000 -0700
> +++ 25-akpm/include/asm-i386/posix_types.h 2003-05-03 15:06:44.000000000 -0700
> @@ -7,7 +7,9 @@
> * assume GCC is being used.
> */
>
> -typedef unsigned short __kernel_dev_t;
> +#ifdef __GNUC__
> +typedef unsigned long long __kernel_dev_t;
> +#endif
> typedef unsigned long __kernel_ino_t;
> typedef unsigned short __kernel_mode_t;
> typedef unsigned short __kernel_nlink_t;
> diff -puN include/linux/kdev_t.h~64-bit-dev_t-kdev_t include/linux/kdev_t.h
> --- 25/include/linux/kdev_t.h~64-bit-dev_t-kdev_t 2003-05-03 15:06:44.000000000 -0700
> +++ 25-akpm/include/linux/kdev_t.h 2003-05-03 15:06:44.000000000 -0700
> @@ -1,82 +1,14 @@
> #ifndef _LINUX_KDEV_T_H
> #define _LINUX_KDEV_T_H
> #ifdef __KERNEL__
> -/*
> -As a preparation for the introduction of larger device numbers,
> -we introduce a type kdev_t to hold them. No information about
> -this type is known outside of this include file.
> -
> -Objects of type kdev_t designate a device. Outside of the kernel
> -the corresponding things are objects of type dev_t - usually an
> -integral type with the device major and minor in the high and low
> -bits, respectively. Conversion is done by
> -
> -extern kdev_t to_kdev_t(int);
> -
> -It is up to the various file systems to decide how objects of type
> -dev_t are stored on disk.
> -The only other point of contact between kernel and outside world
> -are the system calls stat and mknod, new versions of which will
> -eventually have to be used in libc.
> -
> -[Unfortunately, the floppy control ioctls fail to hide the internal
> -kernel structures, and the fd_device field of a struct floppy_drive_struct
> -is user-visible. So, it remains a dev_t for the moment, with some ugly
> -conversions in floppy.c.]
> -
> -Inside the kernel, we aim for a kdev_t type that is a pointer
> -to a structure with information about the device (like major,
> -minor, size, blocksize, sectorsize, name, read-only flag,
> -struct file_operations etc.).
> -
> -However, for the time being we let kdev_t be almost the same as dev_t:
> -
> -typedef struct { unsigned short major, minor; } kdev_t;
> -
> -Admissible operations on an object of type kdev_t:
> -- passing it along
> -- comparing it for equality with another such object
> -- storing it in inode->i_rdev or tty->device
> -- using its bit pattern as argument in a hash function
> -- finding its major and minor
> -- complaining about it
> -
> -An object of type kdev_t is created only by the function MKDEV(),
> -with the single exception of the constant 0 (no device).
> -
> -Right now the other information mentioned above is usually found
> -in static arrays indexed by major or major,minor.
> -
> -An obstacle to immediately using
> - typedef struct { ... (* lots of information *) } *kdev_t
> -is the case of mknod used to create a block device that the
> -kernel doesn't know about at present (but first learns about
> -when some module is inserted).
> -
> -aeb - 950811
> -*/
>
> +#include <linux/types.h> /* for dev_t */
>
> -/*
> - * NOTE NOTE NOTE!
> - *
> - * The kernel-internal "kdev_t" will eventually have
> - * 20 bits for minor numbers, and 12 bits for majors.
> - *
> - * HOWEVER, the external representation is still 8+8
> - * bits, and there is no way to generate the extended
> - * "kdev_t" format yet. Which is just as well, since
> - * we still use "minor" as an index into various
> - * static arrays, and they are sized for a 8-bit index.
> - */
> typedef struct {
> - unsigned short value;
> + unsigned long long value;
> } kdev_t;
>
> -#define KDEV_MINOR_BITS 8
> -#define KDEV_MAJOR_BITS 8
> -
> -#define __mkdev(major,minor) (((major) << KDEV_MINOR_BITS) + (minor))
> +#define __mkdev(major, minor) (((unsigned long long)(major) << 32) + (minor))
>
> #define mk_kdev(major, minor) ((kdev_t) { __mkdev(major,minor) } )
>
> @@ -85,12 +17,12 @@ typedef struct {
> * internal equality comparisons and for things
> * like NFS filehandle conversion.
> */
> -static inline unsigned int kdev_val(kdev_t dev)
> +static inline unsigned long long kdev_val(kdev_t dev)
> {
> return dev.value;
> }
>
> -static inline kdev_t val_to_kdev(unsigned int val)
> +static inline kdev_t val_to_kdev(unsigned long long val)
> {
> kdev_t dev;
> dev.value = val;
> @@ -107,30 +39,68 @@ static inline int kdev_same(kdev_t dev1,
>
> #define kdev_none(d1) (!kdev_val(d1))
>
> -/* Mask off the high bits for now.. */
> -#define minor(dev) ((dev).value & 0xff)
> -#define major(dev) (((dev).value >> KDEV_MINOR_BITS) & 0xff)
> +#define minor(dev) (unsigned int)((dev).value & 0xffffffff)
> +#define major(dev) (unsigned int)((dev).value >> 32)
>
> /* These are for user-level "dev_t" */
> -#define MINORBITS 8
> -#define MINORMASK ((1U << MINORBITS) - 1)
> +/* Going back and forth between dev and (ma,mi) is one-to-one
> + provided ma is nonzero or ma is zero and mi is 8-bit only.
> + Never use major 0 together with a minor larger than 255. */
> +#if 0
> +/* readable versions */
> +static inline unsigned int
> +MAJOR(dev_t dev) {
> + return (dev & ~0xffffffffULL) ? (dev >> 32) :
> + (dev & ~0xffff) ? (dev >> 16) : (dev >> 8);
> +}
> +
> +static inline unsigned int
> +MINOR(dev_t dev) {
> + return (dev & ~0xffffffffULL) ? (dev & 0xffffffff) :
> + (dev & ~0xffff) ? (dev & 0xffff) : (dev & 0xff);
> +}
>
> -#define MAJOR(dev) ((unsigned int) ((dev) >> MINORBITS))
> -#define MINOR(dev) ((unsigned int) ((dev) & MINORMASK))
> -#define MKDEV(ma,mi) (((ma) << MINORBITS) | (mi))
> +static inline dev_t
> +MKDEV(unsigned int major, unsigned int minor) {
> + unsigned int both = (major | minor);
> + return ((both & ~0xffff) ? (((dev_t) major) << 32) :
> + (both & ~0xff) ? (((dev_t) major) << 16) :
> + (((dev_t) major) << 8) ) | minor;
> +}
> +#else
> +/* ugly macro versions */
> +#define MAJOR(dev) ((unsigned int)({ dev_t __dev = dev; \
> + (__dev & ~0xffffffffULL) ? (__dev >> 32) : \
> + (__dev & ~0xffff) ? (__dev >> 16) : (__dev >> 8); }))
> +#define MINOR(dev) ((unsigned int)({ dev_t __dev = dev; \
> + (__dev & ~0xffffffffULL) ? (__dev & 0xffffffff) : \
> + (__dev & ~0xffff) ? (__dev & 0xffff) : (__dev & 0xff); }))
> +#define constant_MKDEV(ma, mi) \
> + ((((ma)|(mi)) & ~0xffff) ? ((ma) << 32) | (mi) : \
> + (((ma)|(mi)) & ~0xff) ? ((ma) << 16) | (mi) : ((ma) << 8) | (mi))
> +#define MKDEV(major, minor) ({ \
> + unsigned int __ma = major, __mi = minor, __both = (__ma | __mi); \
> + ((sizeof(dev_t) > 4 && (__both & ~0xffff)) ? (((dev_t) __ma) << 32) : \
> + (__both & ~0xff) ? (((dev_t) __ma) << 16) : (((dev_t) __ma) << 8) \
> + ) | __mi; })
> +#endif
>
> /*
> * Conversion functions
> */
>
> -static inline int kdev_t_to_nr(kdev_t dev)
> +static inline dev_t kdev_t_to_nr(kdev_t dev)
> {
> - return MKDEV(major(dev), minor(dev));
> + unsigned int ma = major(dev);
> + unsigned int mi = minor(dev);
> + return MKDEV(ma, mi);
> }
>
> -static inline kdev_t to_kdev_t(int dev)
> +static inline kdev_t to_kdev_t(dev_t dev)
> {
> - return mk_kdev(MAJOR(dev),MINOR(dev));
> + unsigned int ma = MAJOR(dev);
> + unsigned int mi = MINOR(dev);
> + return mk_kdev(ma, mi);
> }
>
> #else /* __KERNEL__ */
> @@ -138,6 +108,7 @@ static inline kdev_t to_kdev_t(int dev)
> /*
> Some programs want their definitions of MAJOR and MINOR and MKDEV
> from the kernel sources. These must be the externally visible ones.
> +Of course such programs should be updated.
> */
> #define MAJOR(dev) ((dev)>>8)
> #define MINOR(dev) ((dev) & 0xff)
> diff -puN include/linux/raid/md_k.h~64-bit-dev_t-kdev_t include/linux/raid/md_k.h
> --- 25/include/linux/raid/md_k.h~64-bit-dev_t-kdev_t 2003-05-03 15:06:44.000000000 -0700
> +++ 25-akpm/include/linux/raid/md_k.h 2003-05-03 15:06:44.000000000 -0700
> @@ -64,11 +64,7 @@ static inline int level_to_pers (int lev
> typedef struct mddev_s mddev_t;
> typedef struct mdk_rdev_s mdk_rdev_t;
>
> -#if (MINORBITS != 8)
> -#error MD does not handle bigger kdev yet
> -#endif
> -
> -#define MAX_MD_DEVS (1<<MINORBITS) /* Max number of md dev */
> +#define MAX_MD_DEVS 256 /* Max number of md dev */
>
> /*
> * options passed in raidrun:
> diff -puN include/linux/root_dev.h~64-bit-dev_t-kdev_t include/linux/root_dev.h
> --- 25/include/linux/root_dev.h~64-bit-dev_t-kdev_t 2003-05-03 15:06:44.000000000 -0700
> +++ 25-akpm/include/linux/root_dev.h 2003-05-03 15:06:44.000000000 -0700
> @@ -1,18 +1,16 @@
> #ifndef _ROOT_DEV_H_
> #define _ROOT_DEV_H_
>
> -enum {
> - Root_NFS = MKDEV(UNNAMED_MAJOR, 255),
> - Root_RAM0 = MKDEV(RAMDISK_MAJOR, 0),
> - Root_RAM1 = MKDEV(RAMDISK_MAJOR, 1),
> - Root_FD0 = MKDEV(FLOPPY_MAJOR, 0),
> - Root_HDA1 = MKDEV(IDE0_MAJOR, 1),
> - Root_HDA2 = MKDEV(IDE0_MAJOR, 2),
> - Root_SDA1 = MKDEV(SCSI_DISK0_MAJOR, 1),
> - Root_SDA2 = MKDEV(SCSI_DISK0_MAJOR, 2),
> - Root_HDC1 = MKDEV(IDE1_MAJOR, 1),
> - Root_SR0 = MKDEV(SCSI_CDROM_MAJOR, 0),
> -};
> +#define Root_NFS MKDEV(UNNAMED_MAJOR, 255)
> +#define Root_RAM0 MKDEV(RAMDISK_MAJOR, 0)
> +#define Root_RAM1 MKDEV(RAMDISK_MAJOR, 1)
> +#define Root_FD0 MKDEV(FLOPPY_MAJOR, 0)
> +#define Root_HDA1 MKDEV(IDE0_MAJOR, 1)
> +#define Root_HDA2 MKDEV(IDE0_MAJOR, 2)
> +#define Root_SDA1 MKDEV(SCSI_DISK0_MAJOR, 1)
> +#define Root_SDA2 MKDEV(SCSI_DISK0_MAJOR, 2)
> +#define Root_HDC1 MKDEV(IDE1_MAJOR, 1)
> +#define Root_SR0 MKDEV(SCSI_CDROM_MAJOR, 0)
>
> extern dev_t ROOT_DEV;
>
>
> _
>

2003-05-10 09:08:17

by Jens Axboe

[permalink] [raw]
Subject: Re: Can't find CDR device in -mm only

On Fri, May 09 2003, Shane Shrybman wrote:
> Hi,
>
> The problem first appeared in 2.5.68-mm3 and is not in mainline 2.5.69.
> It is present in all -mm releases since.

Curious. Looking at patches between .68-mm2 and -mm3 reveals nothing
major, in fact the only thing touching anything in that area seems to be
the dynamic request allocation patch. Could you try 2.5.69 with the
attached patch to verify that it still works (or doesn't)? There might
be a small offset in deadline-iosched.c, should be nothing to worry
about.

--
Jens Axboe


Attachments:
(No filename) (543.00 B)
rq-dyn (19.53 kB)
Download all attachments

2003-05-10 14:34:20

by Shane Shrybman

[permalink] [raw]
Subject: Re: Can't find CDR device in -mm only

Hi Jens,

On Sat, 2003-05-10 at 05:20, Jens Axboe wrote:
> On Fri, May 09 2003, Shane Shrybman wrote:
> > Hi,
> >
> > The problem first appeared in 2.5.68-mm3 and is not in mainline 2.5.69.
> > It is present in all -mm releases since.
>
> Curious. Looking at patches between .68-mm2 and -mm3 reveals nothing
> major, in fact the only thing touching anything in that area seems to be
> the dynamic request allocation patch. Could you try 2.5.69 with the
> attached patch to verify that it still works (or doesn't)? There might
> be a small offset in deadline-iosched.c, should be nothing to worry
> about.

Still doesn't work with 2.5.69 + rq_dyn. The output from cdrecord is
below.

BTW, I also tried a 2.5.68-mm3 with 64bit_dev_t, blockdev-aio-support,
and disk_name-size-check backed out but still encountered the problem.

scsidev: '/dev/hdc'
devname: '/dev/hdc'
scsibus: -2 target: -2 lun: -2
scg__open(/dev/hdc) -2,-2,-2
Warning: Open by 'devname' is unintentional and not supported.
l1: 0x0 l2: 0x10
Bus: 0 Target: 0 Lun: 0 Chan: 0 Ino: 0
Linux sg driver version: 3.5.27
l1: 0x0 l2: 0x3
Bus: 0 Target: 0 Lun: 0 Chan: 0 Ino: 0
Target (0,0,0): DMA max 129024 old max: 64512
SCSI buffer size: 64512
Target (0,0,0): DMA max 129024 old max: 64512
scgo_getbuf: 64512 bytes
ioctl ret: 0
host_status: 00 driver_status: 00
ioctl ret: 0
host_status: 00 driver_status: 00
ioctl ret: 0
host_status: 00 driver_status: 00
dev: '/dev/hdc' speed: -1 fs: 4194304 driveropts '(NULL POINTER)'
Cdrecord 2.0 (i686-pc-linux-gnu) Copyright (C) 1995-2002 J?rg Schilling
TOC Type: 1 = CD-ROM
Using libscg version 'schily-0.7'
atapi: 1
Device type : Disk
Version : 2
Response Format: 2
Capabilities :
Vendor_info : 'ADAPTEC '
Identifikation : 'ACB-5500 '
Revision : 'FAKE'
Device seems to be: Adaptec 5500.

Regards,

Shane

2003-05-10 16:28:24

by Jens Axboe

[permalink] [raw]
Subject: Re: Can't find CDR device in -mm only

On Sat, May 10 2003, Shane Shrybman wrote:
> Hi Jens,
>
> On Sat, 2003-05-10 at 05:20, Jens Axboe wrote:
> > On Fri, May 09 2003, Shane Shrybman wrote:
> > > Hi,
> > >
> > > The problem first appeared in 2.5.68-mm3 and is not in mainline 2.5.69.
> > > It is present in all -mm releases since.
> >
> > Curious. Looking at patches between .68-mm2 and -mm3 reveals nothing
> > major, in fact the only thing touching anything in that area seems to be
> > the dynamic request allocation patch. Could you try 2.5.69 with the
> > attached patch to verify that it still works (or doesn't)? There might
> > be a small offset in deadline-iosched.c, should be nothing to worry
> > about.
>
> Still doesn't work with 2.5.69 + rq_dyn. The output from cdrecord is
> below.

Ah thanks, that kind of narrows it down then. I'll take a look at the
problem tomorrow, should be easy to reproduce. Thanks for reporting!

--
Jens Axboe

2003-05-14 07:31:05

by Jens Axboe

[permalink] [raw]
Subject: Re: Can't find CDR device in -mm only

On Sat, May 10 2003, Jens Axboe wrote:
> On Sat, May 10 2003, Shane Shrybman wrote:
> > Hi Jens,
> >
> > On Sat, 2003-05-10 at 05:20, Jens Axboe wrote:
> > > On Fri, May 09 2003, Shane Shrybman wrote:
> > > > Hi,
> > > >
> > > > The problem first appeared in 2.5.68-mm3 and is not in mainline 2.5.69.
> > > > It is present in all -mm releases since.
> > >
> > > Curious. Looking at patches between .68-mm2 and -mm3 reveals nothing
> > > major, in fact the only thing touching anything in that area seems to be
> > > the dynamic request allocation patch. Could you try 2.5.69 with the
> > > attached patch to verify that it still works (or doesn't)? There might
> > > be a small offset in deadline-iosched.c, should be nothing to worry
> > > about.
> >
> > Still doesn't work with 2.5.69 + rq_dyn. The output from cdrecord is
> > below.
>
> Ah thanks, that kind of narrows it down then. I'll take a look at the
> problem tomorrow, should be easy to reproduce. Thanks for reporting!

Please try this patch, it should fix the issue for you. The reason is
that the RW bit is set from get_request() now, and scsi_ioctl always
uses WRITE as arguement to the function. So every request would be
turned into a write, oops :)

===== drivers/block/scsi_ioctl.c 1.25 vs edited =====
--- 1.25/drivers/block/scsi_ioctl.c Tue Apr 29 13:41:31 2003
+++ edited/drivers/block/scsi_ioctl.c Wed May 14 09:42:19 2003
@@ -229,6 +229,8 @@
rq->flags |= REQ_BLOCK_PC;
if (writing)
rq->flags |= REQ_RW;
+ else
+ rq->flags &= ~REQ_RW;

rq->hard_nr_sectors = rq->nr_sectors = nr_sectors;
rq->hard_cur_sectors = rq->current_nr_sectors = nr_sectors;
@@ -375,6 +377,8 @@
rq->flags |= REQ_BLOCK_PC;
if (in_len)
rq->flags |= REQ_RW;
+ else
+ rq->flags &= ~REQ_RW;

blk_do_rq(q, bdev, rq);
err = rq->errors & 0xff; /* only 8 bit SCSI status */

--
Jens Axboe

2003-05-14 22:33:44

by Shane Shrybman

[permalink] [raw]
Subject: Re: Can't find CDR device in -mm only

Thanks Jens! I can now see my burner.

There was the other problem I mentioned too. I use the xcdroast front
end to cdrecord and when I try and dupe a cd it always thinks the cd is
an audio cd and tries to copy it with cdda2wav. This is a big problem
for data cds :) Any idea on what might cause this? I think it has been
this ever since I stopped using ide-scsi in 2.5. There is detailed debug
output in the email I sent you on May 10. I can send it again if
needed.

On Wed, 2003-05-14 at 03:43, Jens Axboe wrote:
> On Sat, May 10 2003, Jens Axboe wrote:
> > On Sat, May 10 2003, Shane Shrybman wrote:
> > > Hi Jens,
> > >
> > > On Sat, 2003-05-10 at 05:20, Jens Axboe wrote:
> > > > On Fri, May 09 2003, Shane Shrybman wrote:
> > > > > Hi,
> > > > >
> > > > > The problem first appeared in 2.5.68-mm3 and is not in mainline 2.5.69.
> > > > > It is present in all -mm releases since.
> > > >
> > > > Curious. Looking at patches between .68-mm2 and -mm3 reveals nothing
> > > > major, in fact the only thing touching anything in that area seems to be
> > > > the dynamic request allocation patch. Could you try 2.5.69 with the
> > > > attached patch to verify that it still works (or doesn't)? There might
> > > > be a small offset in deadline-iosched.c, should be nothing to worry
> > > > about.
> > >
> > > Still doesn't work with 2.5.69 + rq_dyn. The output from cdrecord is
> > > below.
> >
> > Ah thanks, that kind of narrows it down then. I'll take a look at the
> > problem tomorrow, should be easy to reproduce. Thanks for reporting!
>
> Please try this patch, it should fix the issue for you. The reason is
> that the RW bit is set from get_request() now, and scsi_ioctl always
> uses WRITE as arguement to the function. So every request would be
> turned into a write, oops :)
>
> ===== drivers/block/scsi_ioctl.c 1.25 vs edited =====
> --- 1.25/drivers/block/scsi_ioctl.c Tue Apr 29 13:41:31 2003
> +++ edited/drivers/block/scsi_ioctl.c Wed May 14 09:42:19 2003
> @@ -229,6 +229,8 @@
> rq->flags |= REQ_BLOCK_PC;
> if (writing)
> rq->flags |= REQ_RW;
> + else
> + rq->flags &= ~REQ_RW;
>
> rq->hard_nr_sectors = rq->nr_sectors = nr_sectors;
> rq->hard_cur_sectors = rq->current_nr_sectors = nr_sectors;
> @@ -375,6 +377,8 @@
> rq->flags |= REQ_BLOCK_PC;
> if (in_len)
> rq->flags |= REQ_RW;
> + else
> + rq->flags &= ~REQ_RW;
>
> blk_do_rq(q, bdev, rq);
> err = rq->errors & 0xff; /* only 8 bit SCSI status */

Thanks,

shane