[PATCH][2.3.0] mknod stuff

Alexander Viro (viro@math.psu.edu)
Tue, 11 May 1999 22:18:07 -0400 (EDT)


Here is extended version of mknod patch. It's against 2.3.0 (i.e.
should apply to 2.2.8 too).
News: missed cleanup in sysvfs + little cleanup in ext2 (setting
the directory entry type is moved into inlined function; should give the
identical code).
Linus, could you consider applying it?
Cheers,
Al
Patch follows:
diff -urN linux-2.3.0/fs/coda/cnode.c linux-bird.mknod/fs/coda/cnode.c
--- linux-2.3.0/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.3.0/fs/devices.c linux-bird.mknod/fs/devices.c
--- linux-2.3.0/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.3.0/fs/ext2/inode.c linux-bird.mknod/fs/ext2/inode.c
--- linux-2.3.0/fs/ext2/inode.c Tue May 11 19:57:28 1999
+++ linux-bird.mknod/fs/ext2/inode.c Fri May 7 16:24:53 1999
@@ -569,15 +569,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 */ ;
@@ -587,12 +583,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.3.0/fs/ext2/namei.c linux-bird.mknod/fs/ext2/namei.c
--- linux-2.3.0/fs/ext2/namei.c Tue May 11 19:57:28 1999
+++ linux-bird.mknod/fs/ext2/namei.c Tue May 11 21:09:30 1999
@@ -347,6 +347,25 @@
return -ENOENT;
}

+static inline void ext2_set_de_type(struct super_block *sb,
+ struct ext2_dir_entry_2 *de,
+ umode_t mode) {
+ if (!EXT2_HAS_INCOMPAT_FEATURE(sb, EXT2_FEATURE_INCOMPAT_FILETYPE))
+ return;
+ if (S_ISCHR(mode))
+ de->file_type = EXT2_FT_CHRDEV;
+ else if (S_ISBLK(mode))
+ de->file_type = EXT2_FT_BLKDEV;
+ else if (S_ISFIFO(mode))
+ de->file_type = EXT2_FT_FIFO;
+ else if (S_ISLNK(mode))
+ de->file_type = EXT2_FT_SYMLINK;
+ else if (S_ISREG(mode))
+ de->file_type = EXT2_FT_REG_FILE;
+ else if (S_ISDIR(mode))
+ de->file_type = EXT2_FT_DIR;
+}
+
/*
* By the time this is called, we already have created
* the directory cache entry for the new file, but it
@@ -380,9 +399,7 @@
return err;
}
de->inode = cpu_to_le32(inode->i_ino);
- if (EXT2_HAS_INCOMPAT_FEATURE(dir->i_sb,
- EXT2_FEATURE_INCOMPAT_FILETYPE))
- de->file_type = EXT2_FT_REG_FILE;
+ ext2_set_de_type(dir->i_sb, de, S_IFREG);
dir->i_version = ++event;
mark_buffer_dirty(bh, 1);
if (IS_SYNC(dir)) {
@@ -406,36 +423,13 @@
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))
- 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))
- 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))
- de->file_type = EXT2_FT_FIFO;
- }
- if (S_ISBLK(mode) || S_ISCHR(mode))
- inode->i_rdev = to_kdev_t(rdev);
+ ext2_set_de_type(dir->i_sb, de, inode->i_mode);
mark_inode_dirty(inode);
mark_buffer_dirty(bh, 1);
if (IS_SYNC(dir)) {
@@ -486,17 +480,13 @@
de->name_len = 1;
de->rec_len = cpu_to_le16(EXT2_DIR_REC_LEN(de->name_len));
strcpy (de->name, ".");
- if (EXT2_HAS_INCOMPAT_FEATURE(dir->i_sb,
- EXT2_FEATURE_INCOMPAT_FILETYPE))
- de->file_type = EXT2_FT_DIR;
+ ext2_set_de_type(dir->i_sb, de, S_IFDIR);
de = (struct ext2_dir_entry_2 *) ((char *) de + le16_to_cpu(de->rec_len));
de->inode = cpu_to_le32(dir->i_ino);
de->rec_len = cpu_to_le16(inode->i_sb->s_blocksize - EXT2_DIR_REC_LEN(1));
de->name_len = 2;
strcpy (de->name, "..");
- if (EXT2_HAS_INCOMPAT_FEATURE(dir->i_sb,
- EXT2_FEATURE_INCOMPAT_FILETYPE))
- de->file_type = EXT2_FT_DIR;
+ ext2_set_de_type(dir->i_sb, de, S_IFDIR);
inode->i_nlink = 2;
mark_buffer_dirty(dir_block, 1);
brelse (dir_block);
@@ -508,9 +498,7 @@
if (!bh)
goto out_no_entry;
de->inode = cpu_to_le32(inode->i_ino);
- if (EXT2_HAS_INCOMPAT_FEATURE(dir->i_sb,
- EXT2_FEATURE_INCOMPAT_FILETYPE))
- de->file_type = EXT2_FT_DIR;
+ ext2_set_de_type(dir->i_sb, de, S_IFDIR);
dir->i_version = ++event;
mark_buffer_dirty(bh, 1);
if (IS_SYNC(dir)) {
@@ -744,9 +732,7 @@
if (!bh)
goto out_no_entry;
de->inode = cpu_to_le32(inode->i_ino);
- if (EXT2_HAS_INCOMPAT_FEATURE(dir->i_sb,
- EXT2_FEATURE_INCOMPAT_FILETYPE))
- de->file_type = EXT2_FT_SYMLINK;
+ ext2_set_de_type(dir->i_sb, de, S_IFLNK);
dir->i_version = ++event;
mark_buffer_dirty(bh, 1);
if (IS_SYNC(dir)) {
@@ -785,21 +771,7 @@
return err;

de->inode = cpu_to_le32(inode->i_ino);
- if (EXT2_HAS_INCOMPAT_FEATURE(inode->i_sb,
- 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))
- de->file_type = EXT2_FT_CHRDEV;
- else if (S_ISBLK(inode->i_mode))
- de->file_type = EXT2_FT_BLKDEV;
- else if (S_ISFIFO(inode->i_mode))
- de->file_type = EXT2_FT_FIFO;
- }
+ ext2_set_de_type(dir->i_sb, de, inode->i_mode);
dir->i_version = ++event;
mark_buffer_dirty(bh, 1);
if (IS_SYNC(dir)) {
diff -urN linux-2.3.0/fs/hfs/dir.c linux-bird.mknod/fs/hfs/dir.c
--- linux-2.3.0/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.3.0/fs/hfs/dir_cap.c linux-bird.mknod/fs/hfs/dir_cap.c
--- linux-2.3.0/fs/hfs/dir_cap.c Thu Apr 29 07:49:05 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.3.0/fs/hfs/dir_dbl.c linux-bird.mknod/fs/hfs/dir_dbl.c
--- linux-2.3.0/fs/hfs/dir_dbl.c Thu Apr 29 07:49:05 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.3.0/fs/hfs/dir_nat.c linux-bird.mknod/fs/hfs/dir_nat.c
--- linux-2.3.0/fs/hfs/dir_nat.c Thu Apr 29 07:49:06 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.3.0/fs/isofs/inode.c linux-bird.mknod/fs/isofs/inode.c
--- linux-2.3.0/fs/isofs/inode.c Thu Feb 25 10:03:55 1999
+++ linux-bird.mknod/fs/isofs/inode.c Sun May 9 15:29:23 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, kdev_t_to_nr(inode->i_rdev));
}
return;

diff -urN linux-2.3.0/fs/minix/inode.c linux-bird.mknod/fs/minix/inode.c
--- linux-2.3.0/fs/minix/inode.c Thu Apr 29 07:49:09 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.3.0/fs/minix/namei.c linux-bird.mknod/fs/minix/namei.c
--- linux-2.3.0/fs/minix/namei.c Tue May 11 19:57:28 1999
+++ linux-bird.mknod/fs/minix/namei.c Tue May 11 21:09:31 1999
@@ -253,18 +253,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.3.0/fs/namei.c linux-bird.mknod/fs/namei.c
--- linux-2.3.0/fs/namei.c Tue May 11 19:57:28 1999
+++ linux-bird.mknod/fs/namei.c Sun May 9 06:00:57 1999
@@ -633,6 +633,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);
+ error = dir->i_op->create(dir, dentry, mode);
+exit_lock:
+ return error;
+}
+
/*
* open_namei()
*
@@ -695,16 +713,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)
@@ -825,32 +838,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.3.0/fs/nfs/inode.c linux-bird.mknod/fs/nfs/inode.c
--- linux-2.3.0/fs/nfs/inode.c Tue May 11 19:57:28 1999
+++ linux-bird.mknod/fs/nfs/inode.c Sun May 9 06:00:59 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.3.0/fs/qnx4/inode.c linux-bird.mknod/fs/qnx4/inode.c
--- linux-2.3.0/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.3.0/fs/sysv/CHANGES linux-bird.mknod/fs/sysv/CHANGES
--- linux-2.3.0/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.3.0/fs/sysv/inode.c linux-bird.mknod/fs/sysv/inode.c
--- linux-2.3.0/fs/sysv/inode.c Sun Mar 28 14:48:49 1999
+++ linux-bird.mknod/fs/sysv/inode.c Sun May 9 14:27:17 1999
@@ -882,7 +882,7 @@
}
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_a.i_rdev);
+ ;
else
if (sb->sv_convert)
for (block = 0; block < 10+1+1+1; block++)
@@ -899,12 +899,8 @@
inode->i_op = &sysv_dir_inode_operations;
else if (S_ISLNK(inode->i_mode))
inode->i_op = &sysv_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_a.i_rdev);
}

/* To avoid inconsistencies between inodes in memory and inodes on disk. */
diff -urN linux-2.3.0/fs/sysv/namei.c linux-bird.mknod/fs/sysv/namei.c
--- linux-2.3.0/fs/sysv/namei.c Tue May 11 19:57:28 1999
+++ linux-bird.mknod/fs/sysv/namei.c Tue May 11 21:09:33 1999
@@ -240,18 +240,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.3.0/fs/ufs/inode.c linux-bird.mknod/fs/ufs/inode.c
--- linux-2.3.0/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.3.0/fs/ufs/namei.c linux-bird.mknod/fs/ufs/namei.c
--- linux-2.3.0/fs/ufs/namei.c Tue May 11 19:57:28 1999
+++ linux-bird.mknod/fs/ufs/namei.c Tue May 11 21:09:34 1999
@@ -467,18 +467,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.3.0/fs/umsdos/inode.c linux-bird.mknod/fs/umsdos/inode.c
--- linux-2.3.0/fs/umsdos/inode.c Tue Apr 13 09:15:31 1999
+++ linux-bird.mknod/fs/umsdos/inode.c Mon May 10 01:51:07 1999
@@ -163,13 +163,9 @@
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,
+ kdev_t_to_nr(inode->i_rdev));
}


diff -urN linux-2.3.0/include/linux/fs.h linux-bird.mknod/include/linux/fs.h
--- linux-2.3.0/include/linux/fs.h Tue May 11 19:57:33 1999
+++ linux-bird.mknod/include/linux/fs.h Sun May 9 06:01:13 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.3.0/include/linux/hfs_fs.h linux-bird.mknod/include/linux/hfs_fs.h
--- linux-2.3.0/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.3.0/kernel/ksyms.c linux-bird.mknod/kernel/ksyms.c
--- linux-2.3.0/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/