| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 1 | /*  devfs (Device FileSystem) utilities. | 
 | 2 |  | 
 | 3 |     Copyright (C) 1999-2002  Richard Gooch | 
 | 4 |  | 
 | 5 |     This library is free software; you can redistribute it and/or | 
 | 6 |     modify it under the terms of the GNU Library General Public | 
 | 7 |     License as published by the Free Software Foundation; either | 
 | 8 |     version 2 of the License, or (at your option) any later version. | 
 | 9 |  | 
 | 10 |     This library is distributed in the hope that it will be useful, | 
 | 11 |     but WITHOUT ANY WARRANTY; without even the implied warranty of | 
 | 12 |     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU | 
 | 13 |     Library General Public License for more details. | 
 | 14 |  | 
 | 15 |     You should have received a copy of the GNU Library General Public | 
 | 16 |     License along with this library; if not, write to the Free | 
 | 17 |     Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | 
 | 18 |  | 
 | 19 |     Richard Gooch may be reached by email at  rgooch@atnf.csiro.au | 
 | 20 |     The postal address is: | 
 | 21 |       Richard Gooch, c/o ATNF, P. O. Box 76, Epping, N.S.W., 2121, Australia. | 
 | 22 |  | 
 | 23 |     ChangeLog | 
 | 24 |  | 
 | 25 |     19991031   Richard Gooch <rgooch@atnf.csiro.au> | 
 | 26 |                Created. | 
 | 27 |     19991103   Richard Gooch <rgooch@atnf.csiro.au> | 
 | 28 |                Created <_devfs_convert_name> and supported SCSI and IDE CD-ROMs | 
 | 29 |     20000203   Richard Gooch <rgooch@atnf.csiro.au> | 
 | 30 |                Changed operations pointer type to void *. | 
 | 31 |     20000621   Richard Gooch <rgooch@atnf.csiro.au> | 
 | 32 |                Changed interface to <devfs_register_series>. | 
 | 33 |     20000622   Richard Gooch <rgooch@atnf.csiro.au> | 
 | 34 |                Took account of interface change to <devfs_mk_symlink>. | 
 | 35 |                Took account of interface change to <devfs_mk_dir>. | 
 | 36 |     20010519   Richard Gooch <rgooch@atnf.csiro.au> | 
 | 37 |                Documentation cleanup. | 
 | 38 |     20010709   Richard Gooch <rgooch@atnf.csiro.au> | 
 | 39 |                Created <devfs_*alloc_major> and <devfs_*alloc_devnum>. | 
 | 40 |     20010710   Richard Gooch <rgooch@atnf.csiro.au> | 
 | 41 |                Created <devfs_*alloc_unique_number>. | 
 | 42 |     20010730   Richard Gooch <rgooch@atnf.csiro.au> | 
 | 43 |                Documentation typo fix. | 
 | 44 |     20010806   Richard Gooch <rgooch@atnf.csiro.au> | 
 | 45 |                Made <block_semaphore> and <char_semaphore> private. | 
 | 46 |     20010813   Richard Gooch <rgooch@atnf.csiro.au> | 
 | 47 |                Fixed bug in <devfs_alloc_unique_number>: limited to 128 numbers | 
 | 48 |     20010818   Richard Gooch <rgooch@atnf.csiro.au> | 
 | 49 |                Updated major masks up to Linus' "no new majors" proclamation. | 
 | 50 | 	       Block: were 126 now 122 free, char: were 26 now 19 free. | 
 | 51 |     20020324   Richard Gooch <rgooch@atnf.csiro.au> | 
 | 52 |                Fixed bug in <devfs_alloc_unique_number>: was clearing beyond | 
 | 53 | 	       bitfield. | 
 | 54 |     20020326   Richard Gooch <rgooch@atnf.csiro.au> | 
 | 55 |                Fixed bitfield data type for <devfs_*alloc_devnum>. | 
 | 56 |                Made major bitfield type and initialiser 64 bit safe. | 
 | 57 |     20020413   Richard Gooch <rgooch@atnf.csiro.au> | 
 | 58 |                Fixed shift warning on 64 bit machines. | 
 | 59 |     20020428   Richard Gooch <rgooch@atnf.csiro.au> | 
 | 60 |                Copied and used macro for error messages from fs/devfs/base.c  | 
 | 61 |     20021013   Richard Gooch <rgooch@atnf.csiro.au> | 
 | 62 |                Documentation fix. | 
 | 63 |     20030101   Adam J. Richter <adam@yggdrasil.com> | 
 | 64 |                Eliminate DEVFS_SPECIAL_{CHR,BLK}.  Use mode_t instead. | 
 | 65 |     20030106   Christoph Hellwig <hch@infradead.org> | 
 | 66 |                Rewrite devfs_{,de}alloc_devnum to look like C code. | 
 | 67 | */ | 
 | 68 | #include <linux/module.h> | 
 | 69 | #include <linux/init.h> | 
 | 70 | #include <linux/devfs_fs_kernel.h> | 
 | 71 | #include <linux/slab.h> | 
 | 72 | #include <linux/vmalloc.h> | 
 | 73 | #include <linux/genhd.h> | 
 | 74 | #include <linux/bitops.h> | 
 | 75 |  | 
 | 76 | int devfs_register_tape(const char *name) | 
 | 77 | { | 
 | 78 | 	char tname[32], dest[64]; | 
 | 79 | 	static unsigned int tape_counter; | 
 | 80 | 	unsigned int n = tape_counter++; | 
 | 81 |  | 
 | 82 | 	sprintf(dest, "../%s", name); | 
 | 83 | 	sprintf(tname, "tapes/tape%u", n); | 
 | 84 | 	devfs_mk_symlink(tname, dest); | 
 | 85 |  | 
 | 86 | 	return n; | 
 | 87 | } | 
 | 88 |  | 
 | 89 | EXPORT_SYMBOL(devfs_register_tape); | 
 | 90 |  | 
 | 91 | void devfs_unregister_tape(int num) | 
 | 92 | { | 
 | 93 | 	if (num >= 0) | 
 | 94 | 		devfs_remove("tapes/tape%u", num); | 
 | 95 | } | 
 | 96 |  | 
 | 97 | EXPORT_SYMBOL(devfs_unregister_tape); |