[CFT][PATCH] mknod cleanup

Alexander Viro (viro@math.psu.edu)
Fri, 30 Apr 1999 21:30:53 -0400 (EDT)


Proposed changes:
1) the only place where ->mknod() method may be asked to create a regular
file being in sys_mknod(). Make it call ->create() instead.

2) drop the handling of S_IFREG case from ->mknod() methods in filesystems
- it only duplicates ->create().

3) initialization of device/fifo/socket inodes doesn't depend on type of
filesystem. Let's put it into a separate function and allow filesystems
call it. Function being fs/devices.c::init_special_inode(inode, mode, rdev)
with the obvious semantics - it sets i_mode, i_op (for everybody), i_rdev
(for devices) and calls init_fifo() for fifos.

Files affected: fs/devices.c, fs/namei.c, kernel/ksyms.c,
include/linux/fs.h + stuff in fs/*/ (cleanup part).

Impact on filesystems: none, except the possibility to clean up
->mknod() and ->read_inode() methods.

I rolled a patch (aforementioned changes + corresponding cleanup
for mknod-supporting filesystems in official tree). Please, try it. Patch
is pretty straightforward and if there will be no bugs I'll submit it to
Linus. If I didn't make some really stupid screwup it should be safe.

Cheers,
Al

Patch (against 2.2.7) follows:

diff -urN linux-2.2.7/fs/coda/cnode.c linux-bird.mknod/fs/coda/cnode.c
--- linux-2.2.7/fs/coda/cnode.c Thu Feb 25 10:03:58 1999
+++ linux-bird.mknod/fs/coda/cnode.c Fri Apr 30 20:47:16 1999
@@ -29,21 +29,8 @@
inode->i_op = &coda_dir_inode_operations;
else if (S_ISLNK(inode->i_mode))
inode->i_op = &coda_symlink_inode_operations;
- else if (S_ISCHR(inode->i_mode)) {
- inode->i_op = &chrdev_inode_operations;
- inode->i_rdev = to_kdev_t(attr->va_rdev);
- } else if (S_ISBLK(inode->i_mode)) {
- inode->i_op = &blkdev_inode_operations;
- inode->i_rdev = to_kdev_t(attr->va_rdev);
- } else if (S_ISFIFO(inode->i_mode))
- init_fifo(inode);
- else if (S_ISSOCK(inode->i_mode))
- inode->i_op = NULL;
- else {
- printk ("coda_fill_inode: what's this? i_mode = %o\n",
- inode->i_mode);
- inode->i_op = NULL;
- }
+ else
+ init_special_inode(inode, inode->i_mode, attr->va_rdev);
}

/* this is effectively coda_iget:
diff -urN linux-2.2.7/fs/devices.c linux-bird.mknod/fs/devices.c
--- linux-2.2.7/fs/devices.c Thu Feb 25 10:03:55 1999
+++ linux-bird.mknod/fs/devices.c Fri Apr 30 20:47:15 1999
@@ -370,3 +370,21 @@
sprintf(buffer, "%s(%d,%d)", name, MAJOR(dev), MINOR(dev));
return buffer;
}
+
+void init_special_inode(struct inode *inode, umode_t mode, int rdev)
+{
+ inode->i_mode = mode;
+ inode->i_op = NULL;
+ if (S_ISCHR(mode)) {
+ inode->i_op = &chrdev_inode_operations;
+ inode->i_rdev = to_kdev_t(rdev);
+ } else if (S_ISBLK(mode)) {
+ inode->i_op = &blkdev_inode_operations;
+ inode->i_rdev = to_kdev_t(rdev);
+ } else if (S_ISFIFO(mode))
+ init_fifo(inode);
+ else if (S_ISSOCK(mode))
+ ;
+ else
+ printk(KERN_DEBUG "init_special_inode: bogus imode (%o)\n", mode);
+}
diff -urN linux-2.2.7/fs/ext2/inode.c linux-bird.mknod/fs/ext2/inode.c
--- linux-2.2.7/fs/ext2/inode.c Sun Mar 28 14:48:34 1999
+++ linux-bird.mknod/fs/ext2/inode.c Fri Apr 30 20:47:18 1999
@@ -559,15 +559,11 @@
if (inode->u.ext2_i.i_prealloc_count)
ext2_error (inode->i_sb, "ext2_read_inode",
"New inode has non-zero prealloc count!");
- if (S_ISCHR(inode->i_mode) || S_ISBLK(inode->i_mode))
- inode->i_rdev = to_kdev_t(le32_to_cpu(raw_inode->i_block[0]));
- else if (S_ISLNK(inode->i_mode) && !inode->i_blocks)
+ if (S_ISLNK(inode->i_mode) && !inode->i_blocks)
for (block = 0; block < EXT2_N_BLOCKS; block++)
inode->u.ext2_i.i_data[block] = raw_inode->i_block[block];
else for (block = 0; block < EXT2_N_BLOCKS; block++)
inode->u.ext2_i.i_data[block] = le32_to_cpu(raw_inode->i_block[block]);
- brelse (bh);
- inode->i_op = NULL;
if (inode->i_ino == EXT2_ACL_IDX_INO ||
inode->i_ino == EXT2_ACL_DATA_INO)
/* Nothing to do */ ;
@@ -577,12 +573,10 @@
inode->i_op = &ext2_dir_inode_operations;
else if (S_ISLNK(inode->i_mode))
inode->i_op = &ext2_symlink_inode_operations;
- else if (S_ISCHR(inode->i_mode))
- inode->i_op = &chrdev_inode_operations;
- else if (S_ISBLK(inode->i_mode))
- inode->i_op = &blkdev_inode_operations;
- else if (S_ISFIFO(inode->i_mode))
- init_fifo(inode);
+ else
+ init_special_inode(inode, inode->i_mode,
+ le32_to_cpu(raw_inode->i_block[0]));
+ brelse (bh);
inode->i_attr_flags = 0;
if (inode->u.ext2_i.i_flags & EXT2_SYNC_FL) {
inode->i_attr_flags |= ATTR_FLAG_SYNCRONOUS;
diff -urN linux-2.2.7/fs/ext2/namei.c linux-bird.mknod/fs/ext2/namei.c
--- linux-2.2.7/fs/ext2/namei.c Thu Apr 29 08:11:56 1999
+++ linux-bird.mknod/fs/ext2/namei.c Fri Apr 30 20:47:18 1999
@@ -408,36 +408,21 @@
goto out;

inode->i_uid = current->fsuid;
- inode->i_mode = mode;
- inode->i_op = NULL;
+ init_special_inode(inode, mode, rdev);
bh = ext2_add_entry (dir, dentry->d_name.name, dentry->d_name.len, &de, &err);
if (!bh)
goto out_no_entry;
de->inode = cpu_to_le32(inode->i_ino);
dir->i_version = ++event;
- if (S_ISREG(inode->i_mode)) {
- inode->i_op = &ext2_file_inode_operations;
- if (EXT2_HAS_INCOMPAT_FEATURE(dir->i_sb,
- EXT2_FEATURE_INCOMPAT_FILETYPE))
- de->file_type = EXT2_FT_REG_FILE;
- } else if (S_ISCHR(inode->i_mode)) {
- inode->i_op = &chrdev_inode_operations;
- if (EXT2_HAS_INCOMPAT_FEATURE(dir->i_sb,
- EXT2_FEATURE_INCOMPAT_FILETYPE))
+ if (EXT2_HAS_INCOMPAT_FEATURE(dir->i_sb,
+ EXT2_FEATURE_INCOMPAT_FILETYPE)) {
+ if (S_ISCHR(inode->i_mode))
de->file_type = EXT2_FT_CHRDEV;
- } else if (S_ISBLK(inode->i_mode)) {
- inode->i_op = &blkdev_inode_operations;
- if (EXT2_HAS_INCOMPAT_FEATURE(dir->i_sb,
- EXT2_FEATURE_INCOMPAT_FILETYPE))
+ else if (S_ISBLK(inode->i_mode))
de->file_type = EXT2_FT_BLKDEV;
- } else if (S_ISFIFO(inode->i_mode)) {
- init_fifo(inode);
- if (EXT2_HAS_INCOMPAT_FEATURE(dir->i_sb,
- EXT2_FEATURE_INCOMPAT_FILETYPE))
+ else if (S_ISFIFO(inode->i_mode))
de->file_type = EXT2_FT_FIFO;
}
- if (S_ISBLK(mode) || S_ISCHR(mode))
- inode->i_rdev = to_kdev_t(rdev);
mark_inode_dirty(inode);
mark_buffer_dirty(bh, 1);
if (IS_SYNC(dir)) {
@@ -791,8 +776,6 @@
EXT2_FEATURE_INCOMPAT_FILETYPE)) {
if (S_ISREG(inode->i_mode))
de->file_type = EXT2_FT_REG_FILE;
- else if (S_ISDIR(inode->i_mode))
- de->file_type = EXT2_FT_DIR;
else if (S_ISLNK(inode->i_mode))
de->file_type = EXT2_FT_SYMLINK;
else if (S_ISCHR(inode->i_mode))
diff -urN linux-2.2.7/fs/hfs/dir.c linux-bird.mknod/fs/hfs/dir.c
--- linux-2.2.7/fs/hfs/dir.c Tue Apr 13 09:15:14 1999
+++ linux-bird.mknod/fs/hfs/dir.c Fri Apr 30 20:47:19 1999
@@ -255,31 +255,6 @@
}

/*
- * hfs_mknod()
- *
- * This is the mknod() entry in the inode_operations structure for
- * regular HFS directories. The purpose is to create a new entry
- * in a directory, given the inode for the parent directory and the
- * name (and its length) and the mode of the new entry (and the device
- * number if the entry is to be a device special file).
- *
- * HFS only supports regular files and directories and Linux disallows
- * using mknod() to create directories. Thus we just check the arguments
- * and call hfs_create().
- */
-int hfs_mknod(struct inode *dir, struct dentry *dentry, int mode, int rdev)
-{
- if (!dir)
- return -ENOENT;
-
- /* the only thing we currently do. */
- if (S_ISREG(mode))
- return hfs_create(dir, dentry, mode);
-
- return -EPERM;
-}
-
-/*
* hfs_unlink()
*
* This is the unlink() entry in the inode_operations structure for
diff -urN linux-2.2.7/fs/hfs/dir_cap.c linux-bird.mknod/fs/hfs/dir_cap.c
--- linux-2.2.7/fs/hfs/dir_cap.c Thu Apr 29 08:11:56 1999
+++ linux-bird.mknod/fs/hfs/dir_cap.c Fri Apr 30 20:47:19 1999
@@ -83,7 +83,7 @@
NULL, /* symlink */
hfs_mkdir, /* mkdir */
hfs_rmdir, /* rmdir */
- hfs_mknod, /* mknod */
+ NULL, /* mknod */
hfs_rename, /* rename */
NULL, /* readlink */
NULL, /* follow_link */
diff -urN linux-2.2.7/fs/hfs/dir_dbl.c linux-bird.mknod/fs/hfs/dir_dbl.c
--- linux-2.2.7/fs/hfs/dir_dbl.c Thu Apr 29 08:11:56 1999
+++ linux-bird.mknod/fs/hfs/dir_dbl.c Fri Apr 30 20:47:19 1999
@@ -27,7 +27,6 @@
static int dbl_readdir(struct file *, void *, filldir_t);
static int dbl_create(struct inode *, struct dentry *, int);
static int dbl_mkdir(struct inode *, struct dentry *, int);
-static int dbl_mknod(struct inode *, struct dentry *, int, int);
static int dbl_unlink(struct inode *, struct dentry *);
static int dbl_rmdir(struct inode *, struct dentry *);
static int dbl_rename(struct inode *, struct dentry *,
@@ -83,7 +82,7 @@
NULL, /* symlink */
dbl_mkdir, /* mkdir */
dbl_rmdir, /* rmdir */
- dbl_mknod, /* mknod */
+ NULL, /* mknod */
dbl_rename, /* rename */
NULL, /* readlink */
NULL, /* follow_link */
@@ -318,28 +317,6 @@
error = -EEXIST;
} else {
error = hfs_mkdir(parent, dentry, mode);
- }
- return error;
-}
-
-/*
- * dbl_mknod()
- *
- * This is the mknod() entry in the inode_operations structure for
- * regular HFS directories. The purpose is to create a new entry
- * in a directory, given the inode for the parent directory and the
- * name (and its length) and the mode of the new entry (and the device
- * number if the entry is to be a device special file).
- */
-static int dbl_mknod(struct inode *dir, struct dentry *dentry,
- int mode, int rdev)
-{
- int error;
-
- if (is_hdr(dir, dentry->d_name.name, dentry->d_name.len)) {
- error = -EEXIST;
- } else {
- error = hfs_mknod(dir, dentry, mode, rdev);
}
return error;
}
diff -urN linux-2.2.7/fs/hfs/dir_nat.c linux-bird.mknod/fs/hfs/dir_nat.c
--- linux-2.2.7/fs/hfs/dir_nat.c Thu Apr 29 08:11:56 1999
+++ linux-bird.mknod/fs/hfs/dir_nat.c Fri Apr 30 20:47:19 1999
@@ -89,7 +89,7 @@
NULL, /* symlink */
hfs_mkdir, /* mkdir */
nat_rmdir, /* rmdir */
- hfs_mknod, /* mknod */
+ NULL, /* mknod */
hfs_rename, /* rename */
NULL, /* readlink */
NULL, /* follow_link */
diff -urN linux-2.2.7/fs/isofs/inode.c linux-bird.mknod/fs/isofs/inode.c
--- linux-2.2.7/fs/isofs/inode.c Thu Feb 25 10:03:55 1999
+++ linux-bird.mknod/fs/isofs/inode.c Fri Apr 30 20:47:20 1999
@@ -1210,12 +1210,9 @@
inode->i_op = &isofs_dir_inode_operations;
else if (S_ISLNK(inode->i_mode))
inode->i_op = &isofs_symlink_inode_operations;
- else if (S_ISCHR(inode->i_mode))
- inode->i_op = &chrdev_inode_operations;
- else if (S_ISBLK(inode->i_mode))
- inode->i_op = &blkdev_inode_operations;
- else if (S_ISFIFO(inode->i_mode))
- init_fifo(inode);
+ else
+ /* XXX - parse_rock_ridge_inode() had already set i_rdev. */
+ init_special_inode(inode, inode->i_mode, inode->i_rdev);
}
return;

diff -urN linux-2.2.7/fs/minix/inode.c linux-bird.mknod/fs/minix/inode.c
--- linux-2.2.7/fs/minix/inode.c Thu Apr 29 08:11:56 1999
+++ linux-bird.mknod/fs/minix/inode.c Fri Apr 30 20:47:20 1999
@@ -756,23 +756,17 @@
inode->i_size = raw_inode->i_size;
inode->i_mtime = inode->i_atime = inode->i_ctime = raw_inode->i_time;
inode->i_blocks = inode->i_blksize = 0;
- if (S_ISCHR(inode->i_mode) || S_ISBLK(inode->i_mode))
- inode->i_rdev = to_kdev_t(raw_inode->i_zone[0]);
- else for (block = 0; block < 9; block++)
+ for (block = 0; block < 9; block++)
inode->u.minix_i.u.i1_data[block] = raw_inode->i_zone[block];
- brelse(bh);
if (S_ISREG(inode->i_mode))
inode->i_op = &minix_file_inode_operations;
else if (S_ISDIR(inode->i_mode))
inode->i_op = &minix_dir_inode_operations;
else if (S_ISLNK(inode->i_mode))
inode->i_op = &minix_symlink_inode_operations;
- else if (S_ISCHR(inode->i_mode))
- inode->i_op = &chrdev_inode_operations;
- else if (S_ISBLK(inode->i_mode))
- inode->i_op = &blkdev_inode_operations;
- else if (S_ISFIFO(inode->i_mode))
- init_fifo(inode);
+ else
+ init_special_inode(inode, inode->i_mode, raw_inode->i_zone[0]);
+ brelse(bh);
}

/*
@@ -812,23 +806,17 @@
inode->i_atime = raw_inode->i_atime;
inode->i_ctime = raw_inode->i_ctime;
inode->i_blocks = inode->i_blksize = 0;
- if (S_ISCHR(inode->i_mode) || S_ISBLK(inode->i_mode))
- inode->i_rdev = to_kdev_t(raw_inode->i_zone[0]);
- else for (block = 0; block < 10; block++)
+ for (block = 0; block < 10; block++)
inode->u.minix_i.u.i2_data[block] = raw_inode->i_zone[block];
- brelse(bh);
if (S_ISREG(inode->i_mode))
inode->i_op = &minix_file_inode_operations;
else if (S_ISDIR(inode->i_mode))
inode->i_op = &minix_dir_inode_operations;
else if (S_ISLNK(inode->i_mode))
inode->i_op = &minix_symlink_inode_operations;
- else if (S_ISCHR(inode->i_mode))
- inode->i_op = &chrdev_inode_operations;
- else if (S_ISBLK(inode->i_mode))
- inode->i_op = &blkdev_inode_operations;
- else if (S_ISFIFO(inode->i_mode))
- init_fifo(inode);
+ else
+ init_special_inode(inode, inode->i_mode, raw_inode->i_zone[0]);
+ brelse(bh);
}

/*
diff -urN linux-2.2.7/fs/minix/namei.c linux-bird.mknod/fs/minix/namei.c
--- linux-2.2.7/fs/minix/namei.c Thu Apr 29 08:11:56 1999
+++ linux-bird.mknod/fs/minix/namei.c Fri Apr 30 20:47:20 1999
@@ -259,18 +259,7 @@
if (!inode)
return -ENOSPC;
inode->i_uid = current->fsuid;
- inode->i_mode = mode;
- inode->i_op = NULL;
- if (S_ISREG(inode->i_mode))
- inode->i_op = &minix_file_inode_operations;
- else if (S_ISCHR(inode->i_mode))
- inode->i_op = &chrdev_inode_operations;
- else if (S_ISBLK(inode->i_mode))
- inode->i_op = &blkdev_inode_operations;
- else if (S_ISFIFO(inode->i_mode))
- init_fifo(inode);
- if (S_ISBLK(mode) || S_ISCHR(mode))
- inode->i_rdev = to_kdev_t(rdev);
+ init_special_inode(inode, mode, rdev);
mark_inode_dirty(inode);
error = minix_add_entry(dir, dentry->d_name.name, dentry->d_name.len, &bh, &de);
if (error) {
diff -urN linux-2.2.7/fs/namei.c linux-bird.mknod/fs/namei.c
--- linux-2.2.7/fs/namei.c Thu Apr 29 08:11:57 1999
+++ linux-bird.mknod/fs/namei.c Fri Apr 30 20:47:16 1999
@@ -645,6 +645,24 @@
return retval;
}

+int vfs_create(struct inode *dir, struct dentry *dentry, int mode)
+{
+ int error;
+
+ error = may_create(dir, dentry);
+ if (error)
+ goto exit_lock;
+
+ error = -EACCES; /* shouldn't it be ENOSYS? */
+ if (!dir->i_op || !dir->i_op->create)
+ goto exit_lock;
+
+ DQUOT_INIT(dir->d_inode);
+ error = dir->i_op->create(dir, dentry, mode);
+exit_lock:
+ return error;
+}
+
/*
* open_namei()
*
@@ -707,16 +725,11 @@
error = 0;
if (flag & O_EXCL)
error = -EEXIST;
- } else if ((error = may_create(dir->d_inode, dentry)) == 0) {
- if (!dir->d_inode->i_op || !dir->d_inode->i_op->create)
- error = -EACCES;
- else {
- DQUOT_INIT(dir->d_inode);
- error = dir->d_inode->i_op->create(dir->d_inode, dentry, mode);
- /* Don't check for write permission, don't truncate */
- acc_mode = 0;
- flag &= ~O_TRUNC;
- }
+ } else {
+ error = vfs_create(dir->d_inode, dentry,mode);
+ /* Don't check for write permission, don't truncate */
+ acc_mode = 0;
+ flag &= ~O_TRUNC;
}
unlock_dir(dir);
if (error)
@@ -837,32 +850,45 @@
{
int error;
char * tmp;
+ struct dentry * dentry;

lock_kernel();
error = -EPERM;
if (S_ISDIR(mode) || (!S_ISFIFO(mode) && !capable(CAP_SYS_ADMIN)))
goto out;
+ tmp = getname(filename);
+ error = PTR_ERR(tmp);
+ if (IS_ERR(tmp))
+ goto out;
+
error = -EINVAL;
switch (mode & S_IFMT) {
case 0:
- mode |= S_IFREG;
- break;
- case S_IFREG: case S_IFCHR: case S_IFBLK: case S_IFIFO: case S_IFSOCK:
+ mode |= S_IFREG; /* fallthrough */
+ case S_IFREG:
+ mode &= ~current->fs->umask;
+ dentry = lookup_dentry(filename, NULL, LOOKUP_FOLLOW);
+ if (IS_ERR(dentry))
+ error = PTR_ERR(dentry);
+ else {
+ struct dentry *dir = lock_parent(dentry);
+ error = -ENOENT;
+ if (check_parent(dir, dentry))
+ error = vfs_create(dir->d_inode, dentry, mode);
+ dput(dentry);
+ }
break;
- default:
- goto out;
- }
- tmp = getname(filename);
- error = PTR_ERR(tmp);
- if (!IS_ERR(tmp)) {
- struct dentry * dentry = do_mknod(tmp,mode,dev);
- putname(tmp);
+ case S_IFCHR: case S_IFBLK: case S_IFIFO: case S_IFSOCK:
+ dentry = do_mknod(tmp,mode,dev);
error = PTR_ERR(dentry);
if (!IS_ERR(dentry)) {
dput(dentry);
error = 0;
}
+ break;
}
+ putname(tmp);
+
out:
unlock_kernel();
return error;
diff -urN linux-2.2.7/fs/nfs/inode.c linux-bird.mknod/fs/nfs/inode.c
--- linux-2.2.7/fs/nfs/inode.c Thu Apr 29 08:11:57 1999
+++ linux-bird.mknod/fs/nfs/inode.c Fri Apr 30 20:47:20 1999
@@ -470,16 +470,8 @@
inode->i_op = &nfs_dir_inode_operations;
else if (S_ISLNK(inode->i_mode))
inode->i_op = &nfs_symlink_inode_operations;
- else if (S_ISCHR(inode->i_mode)) {
- inode->i_op = &chrdev_inode_operations;
- inode->i_rdev = to_kdev_t(fattr->rdev);
- } else if (S_ISBLK(inode->i_mode)) {
- inode->i_op = &blkdev_inode_operations;
- inode->i_rdev = to_kdev_t(fattr->rdev);
- } else if (S_ISFIFO(inode->i_mode))
- init_fifo(inode);
else
- inode->i_op = NULL;
+ init_special_inode(inode, inode->i_mode, fattr->rdev);
/*
* Preset the size and mtime, as there's no need
* to invalidate the caches.
diff -urN linux-2.2.7/fs/qnx4/inode.c linux-bird.mknod/fs/qnx4/inode.c
--- linux-2.2.7/fs/qnx4/inode.c Thu Feb 25 10:04:02 1999
+++ linux-bird.mknod/fs/qnx4/inode.c Fri Apr 30 20:47:21 1999
@@ -408,29 +408,16 @@

memcpy(&inode->u.qnx4_i, (struct qnx4_inode_info *) raw_inode, QNX4_DIR_ENTRY_SIZE);
inode->i_op = &qnx4_file_inode_operations;
- if (S_ISREG(inode->i_mode)) {
+ if (S_ISREG(inode->i_mode))
inode->i_op = &qnx4_file_inode_operations;
- } else {
- if (S_ISDIR(inode->i_mode)) {
- inode->i_op = &qnx4_dir_inode_operations;
- } else {
- if (S_ISLNK(inode->i_mode)) {
- inode->i_op = &qnx4_symlink_inode_operations;
- } else {
- if (S_ISCHR(inode->i_mode)) {
- inode->i_op = &chrdev_inode_operations;
- } else {
- if (S_ISBLK(inode->i_mode)) {
- inode->i_op = &blkdev_inode_operations;
- } else {
- if (S_ISFIFO(inode->i_mode)) {
- init_fifo(inode);
- }
- }
- }
- }
- }
- }
+ else if (S_ISDIR(inode->i_mode))
+ inode->i_op = &qnx4_dir_inode_operations;
+ else if (S_ISLNK(inode->i_mode))
+ inode->i_op = &qnx4_symlink_inode_operations;
+ else
+ /* HUH??? Where is device number? Oh, well... */
+ init_special_inode(inode, inode->i_mode, 0);
+
brelse(bh);
}

diff -urN linux-2.2.7/fs/sysv/CHANGES linux-bird.mknod/fs/sysv/CHANGES
--- linux-2.2.7/fs/sysv/CHANGES Sun Mar 28 14:55:06 1999
+++ linux-bird.mknod/fs/sysv/CHANGES Fri Apr 30 20:47:21 1999
@@ -53,3 +53,8 @@
_inode()'s job.
* ialloc.c: (sysv_free_inode):
Fixed race.
+
+Sun, 30 Apr 1999 AV
+ * namei.c (sysv_mknod):
+ Removed dead code (S_IFREG case is now passed to
+ ->create() by VFS).
diff -urN linux-2.2.7/fs/sysv/namei.c linux-bird.mknod/fs/sysv/namei.c
--- linux-2.2.7/fs/sysv/namei.c Thu Apr 29 08:11:58 1999
+++ linux-bird.mknod/fs/sysv/namei.c Fri Apr 30 20:49:37 1999
@@ -242,18 +242,7 @@
if (!inode)
return -ENOSPC;
inode->i_uid = current->fsuid;
- inode->i_mode = mode;
- inode->i_op = NULL;
- if (S_ISREG(inode->i_mode))
- inode->i_op = &sysv_file_inode_operations;
- else if (S_ISCHR(inode->i_mode))
- inode->i_op = &chrdev_inode_operations;
- else if (S_ISBLK(inode->i_mode))
- inode->i_op = &blkdev_inode_operations;
- else if (S_ISFIFO(inode->i_mode))
- init_fifo(inode);
- if (S_ISBLK(mode) || S_ISCHR(mode))
- inode->i_rdev = to_kdev_t(rdev);
+ init_special_inode(inode, mode, rdev);
mark_inode_dirty(inode);
error = sysv_add_entry(dir, dentry->d_name.name,
dentry->d_name.len, &bh, &de);
diff -urN linux-2.2.7/fs/ufs/inode.c linux-bird.mknod/fs/ufs/inode.c
--- linux-2.2.7/fs/ufs/inode.c Thu Feb 25 10:03:57 1999
+++ linux-bird.mknod/fs/ufs/inode.c Fri Apr 30 20:47:22 1999
@@ -518,7 +518,7 @@
inode->u.ufs_i.i_lastfrag = howmany (inode->i_size, uspi->s_fsize);

if (S_ISCHR(inode->i_mode) || S_ISBLK(inode->i_mode))
- inode->i_rdev = to_kdev_t(SWAB32(ufs_inode->ui_u2.ui_addr.ui_db[0]));
+ ;
else if (inode->i_blocks) {
for (i = 0; i < (UFS_NDADDR + UFS_NINDIR); i++)
inode->u.ufs_i.i_u1.i_data[i] = ufs_inode->ui_u2.ui_addr.ui_db[i];
@@ -528,7 +528,6 @@
inode->u.ufs_i.i_u1.i_symlink[i] = ufs_inode->ui_u2.ui_symlink[i];
}

- brelse (bh);

inode->i_op = NULL;

@@ -538,12 +537,11 @@
inode->i_op = &ufs_dir_inode_operations;
else if (S_ISLNK(inode->i_mode))
inode->i_op = &ufs_symlink_inode_operations;
- else if (S_ISCHR(inode->i_mode))
- inode->i_op = &chrdev_inode_operations;
- else if (S_ISBLK(inode->i_mode))
- inode->i_op = &blkdev_inode_operations;
- else if (S_ISFIFO(inode->i_mode))
- init_fifo(inode);
+ else
+ init_special_inode(inode, inode->i_mode,
+ SWAB32(ufs_inode->ui_u2.ui_addr.ui_db[0]));
+
+ brelse (bh);

#ifdef UFS_INODE_DEBUG_MORE
ufs_print_inode (inode);
diff -urN linux-2.2.7/fs/ufs/namei.c linux-bird.mknod/fs/ufs/namei.c
--- linux-2.2.7/fs/ufs/namei.c Thu Apr 29 08:11:58 1999
+++ linux-bird.mknod/fs/ufs/namei.c Fri Apr 30 20:47:22 1999
@@ -469,18 +469,7 @@
goto out;

inode->i_uid = current->fsuid;
- inode->i_mode = mode;
- inode->i_op = NULL;
- if (S_ISREG(inode->i_mode))
- inode->i_op = &ufs_file_inode_operations;
- else if (S_ISCHR(inode->i_mode))
- inode->i_op = &chrdev_inode_operations;
- else if (S_ISBLK(inode->i_mode))
- inode->i_op = &blkdev_inode_operations;
- else if (S_ISFIFO(inode->i_mode))
- init_fifo(inode);
- if (S_ISBLK(mode) || S_ISCHR(mode))
- inode->i_rdev = to_kdev_t(rdev);
+ init_special_inode(inode, mode, rdev);
mark_inode_dirty(inode);
bh = ufs_add_entry (dir, dentry->d_name.name, dentry->d_name.len, &de, &err);
if (!bh)
diff -urN linux-2.2.7/fs/umsdos/inode.c linux-bird.mknod/fs/umsdos/inode.c
--- linux-2.2.7/fs/umsdos/inode.c Tue Apr 13 09:15:31 1999
+++ linux-bird.mknod/fs/umsdos/inode.c Fri Apr 30 20:47:23 1999
@@ -163,13 +163,8 @@
umsdos_setup_dir(dentry);
} else if (S_ISLNK (inode->i_mode)) {
inode->i_op = &umsdos_symlink_inode_operations;
- } else if (S_ISCHR (inode->i_mode)) {
- inode->i_op = &chrdev_inode_operations;
- } else if (S_ISBLK (inode->i_mode)) {
- inode->i_op = &blkdev_inode_operations;
- } else if (S_ISFIFO (inode->i_mode)) {
- init_fifo (inode);
- }
+ } else
+ init_special_inode(inode, inode->i_mode, inode->i_rdev);
}


diff -urN linux-2.2.7/include/linux/fs.h linux-bird.mknod/include/linux/fs.h
--- linux-2.2.7/include/linux/fs.h Thu Apr 29 08:12:01 1999
+++ linux-bird.mknod/include/linux/fs.h Fri Apr 30 20:47:25 1999
@@ -719,6 +719,7 @@
extern char * bdevname(kdev_t dev);
extern char * cdevname(kdev_t dev);
extern char * kdevname(kdev_t dev);
+extern void init_special_inode(struct inode *, umode_t, int);


extern void init_fifo(struct inode * inode);
diff -urN linux-2.2.7/include/linux/hfs_fs.h linux-bird.mknod/include/linux/hfs_fs.h
--- linux-2.2.7/include/linux/hfs_fs.h Thu Feb 25 10:04:04 1999
+++ linux-bird.mknod/include/linux/hfs_fs.h Fri Apr 30 20:47:25 1999
@@ -225,7 +225,6 @@
loff_t *);
extern int hfs_create(struct inode *, struct dentry *, int);
extern int hfs_mkdir(struct inode *, struct dentry *, int);
-extern int hfs_mknod(struct inode *, struct dentry *, int, int);
extern int hfs_unlink(struct inode *, struct dentry *);
extern int hfs_rmdir(struct inode *, struct dentry *);
extern int hfs_rename(struct inode *, struct dentry *,
diff -urN linux-2.2.7/kernel/ksyms.c linux-bird.mknod/kernel/ksyms.c
--- linux-2.2.7/kernel/ksyms.c Sun Mar 28 14:49:51 1999
+++ linux-bird.mknod/kernel/ksyms.c Fri Apr 30 20:47:28 1999
@@ -359,6 +359,7 @@
EXPORT_SYMBOL(refile_buffer);
EXPORT_SYMBOL(nr_async_pages);
EXPORT_SYMBOL(___strtok);
+EXPORT_SYMBOL(init_special_inode);
EXPORT_SYMBOL(init_fifo);
EXPORT_SYMBOL(fifo_inode_operations);
EXPORT_SYMBOL(chrdev_inode_operations);

-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.rutgers.edu
Please read the FAQ at http://www.tux.org/lkml/