📄 ext3-wantedi-2.6-rhel4.patch
字号:
Index: linux-2.6.9/fs/ext3/ialloc.c===================================================================--- linux-2.6.9.orig/fs/ext3/ialloc.c 2007-03-13 00:47:22.000000000 +0100+++ linux-2.6.9/fs/ext3/ialloc.c 2007-07-26 09:23:37.000000000 +0200@@ -419,7 +419,8 @@ static int find_group_other(struct super * For other inodes, search forward from the parent directory's block * group to find a free inode. */-struct inode *ext3_new_inode(handle_t *handle, struct inode * dir, int mode)+struct inode *ext3_new_inode(handle_t *handle, struct inode * dir, int mode,+ unsigned long goal) { struct super_block *sb; struct buffer_head *bitmap_bh = NULL;@@ -447,6 +448,41 @@ struct inode *ext3_new_inode(handle_t *h sbi = EXT3_SB(sb); es = sbi->s_es;+ if (goal) {+ group = (goal - 1) / EXT3_INODES_PER_GROUP(sb);+ ino = (goal - 1) % EXT3_INODES_PER_GROUP(sb);+ err = -EIO;++ gdp = ext3_get_group_desc(sb, group, &bh2);+ if (!gdp)+ goto fail;++ bitmap_bh = read_inode_bitmap (sb, group);+ if (!bitmap_bh)+ goto fail;++ BUFFER_TRACE(bh, "get_write_access");+ err = ext3_journal_get_write_access(handle, bitmap_bh);+ if (err) goto fail;++ if (ext3_set_bit_atomic(sb_bgl_lock(sbi, group),+ ino, bitmap_bh->b_data)) {+ printk(KERN_ERR "goal inode %lu unavailable\n", goal);+ /* Oh well, we tried. */+ goto continue_allocation;+ }++ BUFFER_TRACE(bh, "call ext3_journal_dirty_metadata");+ err = ext3_journal_dirty_metadata(handle, bitmap_bh);+ if (err) goto fail;++ /* We've shortcircuited the allocation system successfully,+ * now finish filling in the inode.+ */+ goto got;+ }++continue_allocation: if (S_ISDIR(mode)) { if (test_opt (sb, OLDALLOC)) group = find_group_dir(sb, dir);Index: linux-2.6.9/fs/ext3/ioctl.c===================================================================--- linux-2.6.9.orig/fs/ext3/ioctl.c 2007-03-13 00:47:22.000000000 +0100+++ linux-2.6.9/fs/ext3/ioctl.c 2007-07-26 09:25:24.000000000 +0200@@ -13,6 +13,7 @@ #include <linux/ext3_jbd.h> #include <linux/time.h> #include <asm/uaccess.h>+#include <linux/namei.h> int ext3_ioctl (struct inode * inode, struct file * filp, unsigned int cmd,@@ -25,6 +26,31 @@ int ext3_ioctl (struct inode * inode, st ext3_debug ("cmd = %u, arg = %lu\n", cmd, arg); switch (cmd) {+ case EXT3_IOC_CREATE_INUM: {+ char name[32];+ struct dentry *dchild, *dparent;+ int rc = 0;++ dparent = list_entry(inode->i_dentry.next, struct dentry,+ d_alias);+ snprintf(name, sizeof name, "%lu", arg);+ dchild = lookup_one_len(name, dparent, strlen(name));+ if (dchild->d_inode) {+ printk(KERN_ERR "%*s/%lu already exists (ino %lu)\n",+ dparent->d_name.len, dparent->d_name.name, arg,+ dchild->d_inode->i_ino);+ rc = -EEXIST;+ } else {+ dchild->d_fsdata = (void *)arg;+ rc = vfs_create(inode, dchild, 0644, NULL);+ if (rc)+ printk(KERN_ERR "vfs_create: %d\n", rc);+ else if (dchild->d_inode->i_ino != arg)+ rc = -EEXIST;+ }+ dput(dchild);+ return rc;+ } case EXT3_IOC_GETFLAGS: flags = ei->i_flags & EXT3_FL_USER_VISIBLE; return put_user(flags, (int __user *) arg);Index: linux-2.6.9/fs/ext3/namei.c===================================================================--- linux-2.6.9.orig/fs/ext3/namei.c 2007-03-13 00:47:27.000000000 +0100+++ linux-2.6.9/fs/ext3/namei.c 2007-07-26 09:23:37.000000000 +0200@@ -97,6 +97,7 @@ struct dx_entry __le32 block; }; + /* * dx_root_info is laid out so that if it should somehow get overlaid by a * dirent the two low bits of the hash version will be zero. Therefore, the@@ -141,6 +142,14 @@ struct dx_map_entry u32 offs; }; +#define LVFS_DENTRY_PARAM_MAGIC 20070216UL+struct lvfs_dentry_params+{+ unsigned long p_inum;+ void *p_ptr; + u32 magic;+};+ #ifdef CONFIG_EXT3_INDEX static inline unsigned dx_get_block (struct dx_entry *entry); static void dx_set_block (struct dx_entry *entry, unsigned value);@@ -1633,6 +1642,20 @@ static int ext3_add_nondir(handle_t *han return err; } +static struct inode * ext3_new_inode_wantedi(handle_t *handle, struct inode *dir,+ int mode, struct dentry *dentry)+{+ unsigned long inum = 0;++ if (dentry->d_fsdata != NULL) {+ struct lvfs_dentry_params *param = dentry->d_fsdata;++ if (param->magic == LVFS_DENTRY_PARAM_MAGIC)+ inum = param->p_inum;+ }+ return ext3_new_inode(handle, dir, mode, inum);+}+ /* * By the time this is called, we already have created * the directory cache entry for the new file, but it@@ -1658,7 +1681,7 @@ retry: if (IS_DIRSYNC(dir)) handle->h_sync = 1; - inode = ext3_new_inode (handle, dir, mode);+ inode = ext3_new_inode_wantedi (handle, dir, mode, dentry); err = PTR_ERR(inode); if (!IS_ERR(inode)) { inode->i_op = &ext3_file_inode_operations;@@ -1692,7 +1715,7 @@ retry: if (IS_DIRSYNC(dir)) handle->h_sync = 1; - inode = ext3_new_inode (handle, dir, mode);+ inode = ext3_new_inode_wantedi (handle, dir, mode, dentry); err = PTR_ERR(inode); if (!IS_ERR(inode)) { init_special_inode(inode, inode->i_mode, rdev);@@ -1728,7 +1751,7 @@ retry: if (IS_DIRSYNC(dir)) handle->h_sync = 1; - inode = ext3_new_inode (handle, dir, S_IFDIR | mode);+ inode = ext3_new_inode_wantedi (handle, dir, S_IFDIR | mode, dentry); err = PTR_ERR(inode); if (IS_ERR(inode)) goto out_stop;@@ -2133,7 +2156,7 @@ retry: if (IS_DIRSYNC(dir)) handle->h_sync = 1; - inode = ext3_new_inode (handle, dir, S_IFLNK|S_IRWXUGO);+ inode = ext3_new_inode_wantedi (handle, dir, S_IFLNK|S_IRWXUGO, dentry); err = PTR_ERR(inode); if (IS_ERR(inode)) goto out_stop;Index: linux-2.6.9/include/linux/ext3_fs.h===================================================================--- linux-2.6.9.orig/include/linux/ext3_fs.h 2007-03-13 00:47:22.000000000 +0100+++ linux-2.6.9/include/linux/ext3_fs.h 2007-07-26 09:23:37.000000000 +0200@@ -741,7 +741,8 @@ extern int ext3fs_dirhash(const char *na dx_hash_info *hinfo); /* ialloc.c */-extern struct inode * ext3_new_inode (handle_t *, struct inode *, int);+extern struct inode * ext3_new_inode (handle_t *, struct inode *, int,+ unsigned long); extern void ext3_free_inode (handle_t *, struct inode *); extern struct inode * ext3_orphan_get (struct super_block *, unsigned long); extern unsigned long ext3_count_free_inodes (struct super_block *);@@ -833,4 +834,6 @@ extern struct inode_operations ext3_fast #endif /* __KERNEL__ */ +/* EXT3_IOC_CREATE_INUM at bottom of file (visible to kernel and user). */+#define EXT3_IOC_CREATE_INUM _IOW('f', 5, long) #endif /* _LINUX_EXT3_FS_H */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -