]> git.hungrycats.org Git - linux/commitdiff
[PATCH] break up fs/devices.c
authorBrian Gerst <bgerst@didntduck.org>
Thu, 21 Nov 2002 06:52:04 +0000 (22:52 -0800)
committerLinus Torvalds <torvalds@penguin.transmeta.com>
Thu, 21 Nov 2002 06:52:04 +0000 (22:52 -0800)
This patch breaks up and removes fs/devices.c, moving functions to more
logical places.

  character device functions -> char_dev.c
  init_special_inode() -> inode.c
  kdevname() -> libfs.c (this should die, but that's another patch)
  bad_sock_fops -> socket.c

fs/Makefile
fs/char_dev.c
fs/devices.c [deleted file]
fs/inode.c
fs/libfs.c
fs/proc/proc_misc.c
include/linux/fs.h
net/socket.c

index 963b38e3108fbdf1f62590f36b6838549c8ecb70..0732416467c2c913593fa81adaf194724f33886a 100644 (file)
@@ -8,7 +8,7 @@
 export-objs := open.o dcache.o buffer.o bio.o inode.o dquot.o mpage.o aio.o \
                 fcntl.o read_write.o dcookies.o mbcache.o posix_acl.o xattr_acl.o
 
-obj-y :=       open.o read_write.o devices.o file_table.o buffer.o \
+obj-y :=       open.o read_write.o file_table.o buffer.o \
                bio.o super.o block_dev.o char_dev.o stat.o exec.o pipe.o \
                namei.o fcntl.o ioctl.o readdir.o select.o fifo.o locks.o \
                dcache.o inode.o attr.o bad_inode.o file.o dnotify.o \
index bacc67cfdda15dd023951f40f67ee6d1efcd9465..ff34b5e336cde6f5d5526b05ee5cfa5676adbda1 100644 (file)
 #include <linux/slab.h>
 #include <linux/string.h>
 
+#include <linux/major.h>
+#include <linux/string.h>
+#include <linux/errno.h>
+#include <linux/module.h>
+#include <linux/smp_lock.h>
+#include <linux/devfs_fs_kernel.h>
+
+#ifdef CONFIG_KMOD
+#include <linux/kmod.h>
+#include <linux/tty.h>
+
+/* serial module kmod load support */
+struct tty_driver *get_tty_driver(kdev_t device);
+#define isa_tty_dev(ma)        (ma == TTY_MAJOR || ma == TTYAUX_MAJOR)
+#define need_serial(ma,mi) (get_tty_driver(mk_kdev(ma,mi)) == NULL)
+#endif
+
 #define HASH_BITS      6
 #define HASH_SIZE      (1UL << HASH_BITS)
 #define HASH_MASK      (HASH_SIZE-1)
@@ -113,3 +130,150 @@ void cdput(struct char_device *cdev)
        }
 }
 
+struct device_struct {
+       const char * name;
+       struct file_operations * fops;
+};
+
+static rwlock_t chrdevs_lock = RW_LOCK_UNLOCKED;
+static struct device_struct chrdevs[MAX_CHRDEV];
+
+int get_chrdev_list(char *page)
+{
+       int i;
+       int len;
+
+       len = sprintf(page, "Character devices:\n");
+       read_lock(&chrdevs_lock);
+       for (i = 0; i < MAX_CHRDEV ; i++) {
+               if (chrdevs[i].fops) {
+                       len += sprintf(page+len, "%3d %s\n", i, chrdevs[i].name);
+               }
+       }
+       read_unlock(&chrdevs_lock);
+       return len;
+}
+
+/*
+       Return the function table of a device.
+       Load the driver if needed.
+       Increment the reference count of module in question.
+*/
+static struct file_operations * get_chrfops(unsigned int major, unsigned int minor)
+{
+       struct file_operations *ret = NULL;
+
+       if (!major || major >= MAX_CHRDEV)
+               return NULL;
+
+       read_lock(&chrdevs_lock);
+       ret = fops_get(chrdevs[major].fops);
+       read_unlock(&chrdevs_lock);
+#ifdef CONFIG_KMOD
+       if (ret && isa_tty_dev(major)) {
+               lock_kernel();
+               if (need_serial(major,minor)) {
+                       /* Force request_module anyway, but what for? */
+                       fops_put(ret);
+                       ret = NULL;
+               }
+               unlock_kernel();
+       }
+       if (!ret) {
+               char name[20];
+               sprintf(name, "char-major-%d", major);
+               request_module(name);
+
+               read_lock(&chrdevs_lock);
+               ret = fops_get(chrdevs[major].fops);
+               read_unlock(&chrdevs_lock);
+       }
+#endif
+       return ret;
+}
+
+int register_chrdev(unsigned int major, const char * name, struct file_operations *fops)
+{
+       if (devfs_only())
+               return 0;
+       if (major == 0) {
+               write_lock(&chrdevs_lock);
+               for (major = MAX_CHRDEV-1; major > 0; major--) {
+                       if (chrdevs[major].fops == NULL) {
+                               chrdevs[major].name = name;
+                               chrdevs[major].fops = fops;
+                               write_unlock(&chrdevs_lock);
+                               return major;
+                       }
+               }
+               write_unlock(&chrdevs_lock);
+               return -EBUSY;
+       }
+       if (major >= MAX_CHRDEV)
+               return -EINVAL;
+       write_lock(&chrdevs_lock);
+       if (chrdevs[major].fops && chrdevs[major].fops != fops) {
+               write_unlock(&chrdevs_lock);
+               return -EBUSY;
+       }
+       chrdevs[major].name = name;
+       chrdevs[major].fops = fops;
+       write_unlock(&chrdevs_lock);
+       return 0;
+}
+
+int unregister_chrdev(unsigned int major, const char * name)
+{
+       if (devfs_only())
+               return 0;
+       if (major >= MAX_CHRDEV)
+               return -EINVAL;
+       write_lock(&chrdevs_lock);
+       if (!chrdevs[major].fops || strcmp(chrdevs[major].name, name)) {
+               write_unlock(&chrdevs_lock);
+               return -EINVAL;
+       }
+       chrdevs[major].name = NULL;
+       chrdevs[major].fops = NULL;
+       write_unlock(&chrdevs_lock);
+       return 0;
+}
+
+/*
+ * Called every time a character special file is opened
+ */
+int chrdev_open(struct inode * inode, struct file * filp)
+{
+       int ret = -ENODEV;
+
+       filp->f_op = get_chrfops(major(inode->i_rdev), minor(inode->i_rdev));
+       if (filp->f_op) {
+               ret = 0;
+               if (filp->f_op->open != NULL) {
+                       lock_kernel();
+                       ret = filp->f_op->open(inode,filp);
+                       unlock_kernel();
+               }
+       }
+       return ret;
+}
+
+/*
+ * Dummy default file-operations: the only thing this does
+ * is contain the open that then fills in the correct operations
+ * depending on the special file...
+ */
+struct file_operations def_chr_fops = {
+       .open = chrdev_open,
+};
+
+const char * cdevname(kdev_t dev)
+{
+       static char buffer[32];
+       const char * name = chrdevs[major(dev)].name;
+
+       if (!name)
+               name = "unknown-char";
+       sprintf(buffer, "%s(%d,%d)", name, major(dev), minor(dev));
+       return buffer;
+}
diff --git a/fs/devices.c b/fs/devices.c
deleted file mode 100644 (file)
index adf0505..0000000
+++ /dev/null
@@ -1,222 +0,0 @@
-/*
- *  linux/fs/devices.c
- *
- * (C) 1993 Matthias Urlichs -- collected common code and tables.
- * 
- *  Copyright (C) 1991, 1992  Linus Torvalds
- *
- *  Added kerneld support: Jacques Gelinas and Bjorn Ekwall
- *  (changed to kmod)
- */
-
-#include <linux/config.h>
-#include <linux/fs.h>
-#include <linux/major.h>
-#include <linux/string.h>
-#include <linux/time.h>
-#include <linux/stat.h>
-#include <linux/fcntl.h>
-#include <linux/errno.h>
-#include <linux/module.h>
-#include <linux/smp_lock.h>
-#include <linux/devfs_fs_kernel.h>
-#ifdef CONFIG_KMOD
-#include <linux/kmod.h>
-
-#include <linux/tty.h>
-
-/* serial module kmod load support */
-struct tty_driver *get_tty_driver(kdev_t device);
-#define isa_tty_dev(ma)        (ma == TTY_MAJOR || ma == TTYAUX_MAJOR)
-#define need_serial(ma,mi) (get_tty_driver(mk_kdev(ma,mi)) == NULL)
-#endif
-
-struct device_struct {
-       const char * name;
-       struct file_operations * fops;
-};
-
-static rwlock_t chrdevs_lock = RW_LOCK_UNLOCKED;
-static struct device_struct chrdevs[MAX_CHRDEV];
-
-extern int get_blkdev_list(char *);
-
-int get_device_list(char * page)
-{
-       int i;
-       int len;
-
-       len = sprintf(page, "Character devices:\n");
-       read_lock(&chrdevs_lock);
-       for (i = 0; i < MAX_CHRDEV ; i++) {
-               if (chrdevs[i].fops) {
-                       len += sprintf(page+len, "%3d %s\n", i, chrdevs[i].name);
-               }
-       }
-       read_unlock(&chrdevs_lock);
-       len += get_blkdev_list(page+len);
-       return len;
-}
-
-/*
-       Return the function table of a device.
-       Load the driver if needed.
-       Increment the reference count of module in question.
-*/
-static struct file_operations * get_chrfops(unsigned int major, unsigned int minor)
-{
-       struct file_operations *ret = NULL;
-
-       if (!major || major >= MAX_CHRDEV)
-               return NULL;
-
-       read_lock(&chrdevs_lock);
-       ret = fops_get(chrdevs[major].fops);
-       read_unlock(&chrdevs_lock);
-#ifdef CONFIG_KMOD
-       if (ret && isa_tty_dev(major)) {
-               lock_kernel();
-               if (need_serial(major,minor)) {
-                       /* Force request_module anyway, but what for? */
-                       fops_put(ret);
-                       ret = NULL;
-               }
-               unlock_kernel();
-       }
-       if (!ret) {
-               char name[20];
-               sprintf(name, "char-major-%d", major);
-               request_module(name);
-
-               read_lock(&chrdevs_lock);
-               ret = fops_get(chrdevs[major].fops);
-               read_unlock(&chrdevs_lock);
-       }
-#endif
-       return ret;
-}
-
-int register_chrdev(unsigned int major, const char * name, struct file_operations *fops)
-{
-       if (devfs_only())
-               return 0;
-       if (major == 0) {
-               write_lock(&chrdevs_lock);
-               for (major = MAX_CHRDEV-1; major > 0; major--) {
-                       if (chrdevs[major].fops == NULL) {
-                               chrdevs[major].name = name;
-                               chrdevs[major].fops = fops;
-                               write_unlock(&chrdevs_lock);
-                               return major;
-                       }
-               }
-               write_unlock(&chrdevs_lock);
-               return -EBUSY;
-       }
-       if (major >= MAX_CHRDEV)
-               return -EINVAL;
-       write_lock(&chrdevs_lock);
-       if (chrdevs[major].fops && chrdevs[major].fops != fops) {
-               write_unlock(&chrdevs_lock);
-               return -EBUSY;
-       }
-       chrdevs[major].name = name;
-       chrdevs[major].fops = fops;
-       write_unlock(&chrdevs_lock);
-       return 0;
-}
-
-int unregister_chrdev(unsigned int major, const char * name)
-{
-       if (devfs_only())
-               return 0;
-       if (major >= MAX_CHRDEV)
-               return -EINVAL;
-       write_lock(&chrdevs_lock);
-       if (!chrdevs[major].fops || strcmp(chrdevs[major].name, name)) {
-               write_unlock(&chrdevs_lock);
-               return -EINVAL;
-       }
-       chrdevs[major].name = NULL;
-       chrdevs[major].fops = NULL;
-       write_unlock(&chrdevs_lock);
-       return 0;
-}
-
-/*
- * Called every time a character special file is opened
- */
-int chrdev_open(struct inode * inode, struct file * filp)
-{
-       int ret = -ENODEV;
-
-       filp->f_op = get_chrfops(major(inode->i_rdev), minor(inode->i_rdev));
-       if (filp->f_op) {
-               ret = 0;
-               if (filp->f_op->open != NULL) {
-                       lock_kernel();
-                       ret = filp->f_op->open(inode,filp);
-                       unlock_kernel();
-               }
-       }
-       return ret;
-}
-
-/*
- * Dummy default file-operations: the only thing this does
- * is contain the open that then fills in the correct operations
- * depending on the special file...
- */
-static struct file_operations def_chr_fops = {
-       .open           = chrdev_open,
-};
-
-/*
- * Print device name (in decimal, hexadecimal or symbolic)
- * Note: returns pointer to static data!
- */
-const char * kdevname(kdev_t dev)
-{
-       static char buffer[32];
-       sprintf(buffer, "%02x:%02x", major(dev), minor(dev));
-       return buffer;
-}
-
-const char * cdevname(kdev_t dev)
-{
-       static char buffer[32];
-       const char * name = chrdevs[major(dev)].name;
-
-       if (!name)
-               name = "unknown-char";
-       sprintf(buffer, "%s(%d,%d)", name, major(dev), minor(dev));
-       return buffer;
-}
-  
-static int sock_no_open(struct inode *irrelevant, struct file *dontcare)
-{
-       return -ENXIO;
-}
-
-static struct file_operations bad_sock_fops = {
-       .open           = sock_no_open
-};
-
-void init_special_inode(struct inode *inode, umode_t mode, dev_t rdev)
-{
-       inode->i_mode = mode;
-       if (S_ISCHR(mode)) {
-               inode->i_fop = &def_chr_fops;
-               inode->i_rdev = to_kdev_t(rdev);
-               inode->i_cdev = cdget(rdev);
-       } else if (S_ISBLK(mode)) {
-               inode->i_fop = &def_blk_fops;
-               inode->i_rdev = to_kdev_t(rdev);
-       } else if (S_ISFIFO(mode))
-               inode->i_fop = &def_fifo_fops;
-       else if (S_ISSOCK(mode))
-               inode->i_fop = &bad_sock_fops;
-       else
-               printk(KERN_DEBUG "init_special_inode: bogus imode (%o)\n",
-                      mode);
-}
index 1cb734ec9589ba163e6204189f878b7808e901c5..c14cc396654e0ee247c7911b5ac864da5ab00ea1 100644 (file)
@@ -1270,3 +1270,21 @@ void __init inode_init(unsigned long mempages)
 
        set_shrinker(DEFAULT_SEEKS, shrink_icache_memory);
 }
+
+void init_special_inode(struct inode *inode, umode_t mode, dev_t rdev)
+{
+       inode->i_mode = mode;
+       if (S_ISCHR(mode)) {
+               inode->i_fop = &def_chr_fops;
+               inode->i_rdev = to_kdev_t(rdev);
+               inode->i_cdev = cdget(rdev);
+       } else if (S_ISBLK(mode)) {
+               inode->i_fop = &def_blk_fops;
+               inode->i_rdev = to_kdev_t(rdev);
+       } else if (S_ISFIFO(mode))
+               inode->i_fop = &def_fifo_fops;
+       else if (S_ISSOCK(mode))
+               inode->i_fop = &bad_sock_fops;
+       else
+               printk(KERN_DEBUG "init_special_inode: bogus i_mode (%o)\n", mode);
+}
index 07ab22e1c256f109de977b7b1d63a23ceae8cb43..813bc9046bcdeb7f19f2d7f6486b4b49bc2daae7 100644 (file)
@@ -323,3 +323,14 @@ int simple_commit_write(struct file *file, struct page *page,
        set_page_dirty(page);
        return 0;
 }
+
+/*
+ * Print device name (in decimal, hexadecimal or symbolic)
+ * Note: returns pointer to static data!
+ */
+const char * kdevname(kdev_t dev)
+{
+       static char buffer[32];
+       sprintf(buffer, "%02x:%02x", major(dev), minor(dev));
+       return buffer;
+}
index fcc79c979b39e5fbce01a100621e0c86b02c54f0..ba7f6659b203654e0bf92ee7dcac4f7514b18a77 100644 (file)
@@ -57,7 +57,8 @@
  */
 extern int get_hardware_list(char *);
 extern int get_stram_list(char *);
-extern int get_device_list(char *);
+extern int get_chrdev_list(char *);
+extern int get_blkdev_list(char *);
 extern int get_filesystem_list(char *);
 extern int get_exec_domain_list(char *);
 extern int get_dma_list(char *);
@@ -376,7 +377,8 @@ static int kstat_read_proc(char *page, char **start, off_t off,
 static int devices_read_proc(char *page, char **start, off_t off,
                                 int count, int *eof, void *data)
 {
-       int len = get_device_list(page);
+       int len = get_chrdev_list(page);
+       len += get_blkdev_list(page+len);
        return proc_calc_metrics(page, start, off, count, eof, len);
 }
 
index bbb4e2cacecca1fa2faaeccc5a12d6f450c5e72a..7234a60f85a52339b5fdb67fcabb2b6d493bdb6e 100644 (file)
@@ -1089,6 +1089,8 @@ extern int blkdev_open(struct inode *, struct file *);
 extern int blkdev_close(struct inode *, struct file *);
 extern struct file_operations def_blk_fops;
 extern struct address_space_operations def_blk_aops;
+extern struct file_operations def_chr_fops;
+extern struct file_operations bad_sock_fops;
 extern struct file_operations def_fifo_fops;
 extern int ioctl_by_bdev(struct block_device *, unsigned, unsigned long);
 extern int blkdev_ioctl(struct inode *, struct file *, unsigned, unsigned long);
index f46e465d5fa22b9d7e7079a2a93aca10af48b8fe..448ed2c395a3375573b4a385513b096027f8f3b3 100644 (file)
@@ -491,6 +491,10 @@ static int sock_no_open(struct inode *irrelevant, struct file *dontcare)
        return -ENXIO;
 }
 
+struct file_operations bad_sock_fops = {
+       .open = sock_no_open,
+};
+
 /**
  *     sock_release    -       close a socket
  *     @sock: socket to close