⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ext3-wantedi-2.6-suse.patch

📁 非常经典的一个分布式系统
💻 PATCH
字号:
diff -urp linux-2.6.5-7.282.orig/fs/ext3/ialloc.c linux-2.6.5-7.282/fs/ext3/ialloc.c--- linux-2.6.5-7.282.orig/fs/ext3/ialloc.c	2006-08-30 17:12:13.000000000 +0300+++ linux-2.6.5-7.282/fs/ext3/ialloc.c	2007-02-16 07:43:08.000000000 +0200@@ -420,7 +420,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;@@ -448,6 +449,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);diff -urp linux-2.6.5-7.282.orig/fs/ext3/ioctl.c linux-2.6.5-7.282/fs/ext3/ioctl.c--- linux-2.6.5-7.282.orig/fs/ext3/ioctl.c	2006-08-30 17:12:13.000000000 +0300+++ linux-2.6.5-7.282/fs/ext3/ioctl.c	2007-02-16 07:43:08.000000000 +0200@@ -25,6 +25,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 *) arg);diff -urp linux-2.6.5-7.282.orig/fs/ext3/namei.c linux-2.6.5-7.282/fs/ext3/namei.c--- linux-2.6.5-7.282.orig/fs/ext3/namei.c	2006-08-30 17:12:34.000000000 +0300+++ linux-2.6.5-7.282/fs/ext3/namei.c	2007-02-16 07:46:13.000000000 +0200@@ -144,6 +144,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);@@ -1625,6 +1633,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@@ -1649,7 +1671,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;@@ -1682,7 +1704,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);@@ -1718,7 +1740,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;@@ -2113,7 +2135,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;diff -urp linux-2.6.5-7.282.orig/include/linux/ext3_fs.h linux-2.6.5-7.282/include/linux/ext3_fs.h--- linux-2.6.5-7.282.orig/include/linux/ext3_fs.h	2006-08-30 17:12:13.000000000 +0300+++ linux-2.6.5-7.282/include/linux/ext3_fs.h	2007-02-16 07:43:08.000000000 +0200@@ -203,6 +203,7 @@ struct ext3_group_desc #define	EXT3_IOC_SETFLAGS		_IOW('f', 2, long) #define	EXT3_IOC_GETVERSION		_IOR('f', 3, long) #define	EXT3_IOC_SETVERSION		_IOW('f', 4, long)+/* EXT3_IOC_CREATE_INUM at bottom of file (visible to kernel and user). */ #define	EXT3_IOC_GETVERSION_OLD		_IOR('v', 1, long) #define	EXT3_IOC_SETVERSION_OLD		_IOW('v', 2, long) #ifdef CONFIG_JBD_DEBUG@@ -712,7 +713,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 *);@@ -797,4 +799,5 @@ extern struct inode_operations ext3_fast  #endif	/* __KERNEL__ */ +#define EXT3_IOC_CREATE_INUM			_IOW('f', 5, long) #endif	/* _LINUX_EXT3_FS_H */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -