Commit 5900b098 authored by Alexander Viro's avatar Alexander Viro Committed by Linus Torvalds

[PATCH] large dev_t - second series (8/15)

	kdev_t, to_kdev_t(), etc. are gone - there is no more objects
of that type and no remaining callers of these functions.
parent ad1da81a
...@@ -178,7 +178,7 @@ tape_assign_minor(struct tape_device *device) ...@@ -178,7 +178,7 @@ tape_assign_minor(struct tape_device *device)
break; break;
minor += TAPE_MINORS_PER_DEV; minor += TAPE_MINORS_PER_DEV;
} }
if (minor >= (1 << KDEV_MINOR_BITS)) { if (minor >= 256) {
write_unlock(&tape_device_lock); write_unlock(&tape_device_lock);
return -ENODEV; return -ENODEV;
} }
......
...@@ -80,7 +80,7 @@ static int tape_proc_show(struct seq_file *m, void *v) ...@@ -80,7 +80,7 @@ static int tape_proc_show(struct seq_file *m, void *v)
static void *tape_proc_start(struct seq_file *m, loff_t *pos) static void *tape_proc_start(struct seq_file *m, loff_t *pos)
{ {
if (*pos >= (1 << KDEV_MINOR_BITS) / TAPE_MINORS_PER_DEV) if (*pos >= 256 / TAPE_MINORS_PER_DEV)
return NULL; return NULL;
return (void *)((unsigned long) *pos + 1); return (void *)((unsigned long) *pos + 1);
} }
......
...@@ -83,7 +83,7 @@ static void sg_proc_cleanup(void); ...@@ -83,7 +83,7 @@ static void sg_proc_cleanup(void);
#define SG_ALLOW_DIO_DEF 0 #define SG_ALLOW_DIO_DEF 0
#define SG_ALLOW_DIO_CODE /* compile out by commenting this define */ #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 (256 - 1)
/* /*
* Suppose you want to calculate the formula muldiv(x,m,d)=int(x * m / d) * Suppose you want to calculate the formula muldiv(x,m,d)=int(x * m / d)
......
...@@ -59,7 +59,7 @@ ...@@ -59,7 +59,7 @@
MODULE_PARM(xa_test, "i"); /* see sr_ioctl.c */ 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 MAX_RETRIES 3
#define SR_TIMEOUT (30 * HZ) #define SR_TIMEOUT (30 * HZ)
......
#ifndef _LINUX_KDEV_T_H #ifndef _LINUX_KDEV_T_H
#define _LINUX_KDEV_T_H #define _LINUX_KDEV_T_H
#ifdef __KERNEL__ #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
*/
/*
* 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;
} kdev_t;
#define KDEV_MINOR_BITS 8
#define KDEV_MAJOR_BITS 8
#define __mkdev(major,minor) (((major) << KDEV_MINOR_BITS) + (minor))
#define mk_kdev(major, minor) ((kdev_t) { __mkdev(major,minor) } )
#define NODEV (mk_kdev(0,0))
/* Mask off the high bits for now.. */
#define minor(dev) ((dev).value & 0xff)
#define major(dev) (((dev).value >> KDEV_MINOR_BITS) & 0xff)
/* These are for user-level "dev_t" */ /* These are for user-level "dev_t" */
#define MINORBITS 8 #define MINORBITS 8
#define MINORMASK ((1U << MINORBITS) - 1) #define MINORMASK ((1U << MINORBITS) - 1)
...@@ -94,20 +9,6 @@ typedef struct { ...@@ -94,20 +9,6 @@ typedef struct {
#define MINOR(dev) ((unsigned int) ((dev) & MINORMASK)) #define MINOR(dev) ((unsigned int) ((dev) & MINORMASK))
#define MKDEV(ma,mi) (((ma) << MINORBITS) | (mi)) #define MKDEV(ma,mi) (((ma) << MINORBITS) | (mi))
/*
* Conversion functions
*/
static inline int kdev_t_to_nr(kdev_t dev)
{
return MKDEV(major(dev), minor(dev));
}
static inline kdev_t to_kdev_t(int dev)
{
return mk_kdev(MAJOR(dev),MINOR(dev));
}
#define print_dev_t(buffer, dev) \ #define print_dev_t(buffer, dev) \
sprintf((buffer), "%u:%u\n", MAJOR(dev), MINOR(dev)) sprintf((buffer), "%u:%u\n", MAJOR(dev), MINOR(dev))
......
...@@ -57,7 +57,7 @@ ...@@ -57,7 +57,7 @@
* [TO FIX] * [TO FIX]
* ECONNREFUSED is not returned from one end of a connected() socket to the * ECONNREFUSED is not returned from one end of a connected() socket to the
* other the moment one end closes. * other the moment one end closes.
* fstat() doesn't return st_dev=NODEV, and give the blksize as high water mark * fstat() doesn't return st_dev=0, and give the blksize as high water mark
* and a fake inode identifier (nor the BSD first socket fstat twice bug). * and a fake inode identifier (nor the BSD first socket fstat twice bug).
* [NOT TO FIX] * [NOT TO FIX]
* accept() returns a path name even if the connecting socket has closed * accept() returns a path name even if the connecting socket has closed
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment