unsigned char no_more_additions:1;
};
-struct file_type
-{
- struct file_operations *ops;
- unsigned long size;
-};
-
struct bdev_type
{
struct block_device_operations *ops;
union
{
struct directory_type dir;
- struct file_type file;
struct bdev_type bdev;
struct cdev_type cdev;
struct symlink_type symlink;
de->u.cdev.autogen = devnum != 0;
de->u.bdev.ops = ops;
if (flags & DEVFS_FL_REMOVABLE) de->u.bdev.removable = TRUE;
- } else if ( S_ISREG (mode) ) {
- de->u.file.ops = ops;
} else {
PRINTK ("(%s): illegal mode: %x\n", name, mode);
devfs_put (de);
static struct file_operations *devfs_get_ops (devfs_handle_t de)
{
- struct module *owner;
- struct file_operations *ops;
+ struct file_operations *ops = de->u.cdev.ops;
+ struct module *owner = ops->owner;
- if (de == NULL) return NULL;
- VERIFY_ENTRY (de);
- if (S_ISCHR (de->mode))
- ops = de->u.cdev.ops;
- else
- ops = de->u.file.ops;
- if (!ops)
- return NULL;
- owner = ops->owner;
read_lock (&de->parent->u.dir.lock); /* Prevent module from unloading */
if ( (de->next == de) || !try_module_get (owner) )
{ /* Entry is already unhooked or module is unloading */
return ops;
} /* End Function devfs_get_ops */
-/**
- * devfs_set_file_size - Set the file size for a devfs regular file.
- * @de: The handle to the device entry.
- * @size: The new file size.
- *
- * Returns 0 on success, else a negative error code.
- */
-
-int devfs_set_file_size (devfs_handle_t de, unsigned long size)
-{
- if (de == NULL) return -EINVAL;
- VERIFY_ENTRY (de);
- if ( !S_ISREG (de->mode) ) return -EINVAL;
- if (de->u.file.size == size) return 0;
- de->u.file.size = size;
- if (de->inode.dentry == NULL) return 0;
- if (de->inode.dentry->d_inode == NULL) return 0;
- de->inode.dentry->d_inode->i_size = size;
- return 0;
-} /* End Function devfs_set_file_size */
-
-
/**
* devfs_setup - Process kernel boot options.
* @str: The boot options after the "devfs=".
if (bd_acquire (inode) != 0)
PRINTK ("(%d): no block device from bdget()\n",(int)inode->i_ino);
}
- else if ( S_ISFIFO (de->mode) ) inode->i_fop = &def_fifo_fops;
- else if ( S_ISREG (de->mode) )
- {
- inode->i_size = de->u.file.size;
- }
+ else if ( S_ISFIFO (de->mode) )
+ inode->i_fop = &def_fifo_fops;
else if ( S_ISDIR (de->mode) )
{
inode->i_op = &devfs_dir_iops;
}
else
err = chrdev_open (inode, file);
- } else if (S_ISREG(inode->i_mode)) {
- ops = devfs_get_ops (de); /* Now have module refcount */
- file->f_op = ops;
- if (file->f_op)
- {
- lock_kernel ();
- err = file->f_op->open ? (*file->f_op->open) (inode, file) : 0;
- unlock_kernel ();
- }
}
return err;
} /* End Function devfs_open */
extern devfs_handle_t devfs_mk_dir (devfs_handle_t dir, const char *name,
void *info);
extern int devfs_generate_path (devfs_handle_t de, char *path, int buflen);
-extern int devfs_set_file_size (devfs_handle_t de, unsigned long size);
extern int devfs_register_tape (devfs_handle_t de);
extern void devfs_unregister_tape(int num);
extern int devfs_alloc_unique_number (struct unique_numspace *space);
{
return -ENOSYS;
}
-static inline int devfs_set_file_size (devfs_handle_t de, unsigned long size)
-{
- return -ENOSYS;
-}
static inline int devfs_register_tape (devfs_handle_t de)
{
return -1;