Messages in this thread Patch in this message | | | Date | Fri, 30 Apr 1999 21:30:53 -0400 (EDT) | From | Alexander Viro <> | Subject | [CFT][PATCH] mknod cleanup |
| |
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/
| |