Skip to content
Snippets Groups Projects
Commit a1357cb6 authored by Eric Mei's avatar Eric Mei
Browse files

port several patches to 2.6.3

parent fc45b584
No related branches found
No related tags found
No related merge requests found
fs/ext3/ialloc.c | 35 ++++++++++++++++++++++++++++++++++-
fs/ext3/ioctl.c | 25 +++++++++++++++++++++++++
fs/ext3/namei.c | 21 +++++++++++++++++----
include/linux/dcache.h | 5 +++++
include/linux/ext3_fs.h | 5 ++++-
5 files changed, 85 insertions(+), 6 deletions(-)
Index: uml-2.6.3/fs/ext3/ialloc.c
===================================================================
--- uml-2.6.3.orig/fs/ext3/ialloc.c 2004-02-20 15:00:48.000000000 +0800
+++ uml-2.6.3/fs/ext3/ialloc.c 2004-02-21 00:24:45.202693776 +0800
@@ -420,7 +420,8 @@
* 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,38 @@
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);
+ gdp = ext3_get_group_desc(sb, group, &bh2);
+
+ err = -EIO;
+ 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: uml-2.6.3/fs/ext3/ioctl.c
===================================================================
--- uml-2.6.3.orig/fs/ext3/ioctl.c 2004-01-09 14:59:26.000000000 +0800
+++ uml-2.6.3/fs/ext3/ioctl.c 2004-02-21 00:21:04.541239416 +0800
@@ -24,6 +24,31 @@
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);
Index: uml-2.6.3/fs/ext3/namei.c
===================================================================
--- uml-2.6.3.orig/fs/ext3/namei.c 2004-02-20 15:01:27.000000000 +0800
+++ uml-2.6.3/fs/ext3/namei.c 2004-02-21 00:21:04.611228776 +0800
@@ -1617,6 +1617,19 @@
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 dentry_params *param =
+ (struct dentry_params *) dentry->d_fsdata;
+ 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
@@ -1640,7 +1653,7 @@
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;
@@ -1670,7 +1683,7 @@
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);
@@ -1702,7 +1715,7 @@
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;
@@ -2094,7 +2107,7 @@
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: uml-2.6.3/include/linux/dcache.h
===================================================================
--- uml-2.6.3.orig/include/linux/dcache.h 2004-02-21 00:19:14.365988600 +0800
+++ uml-2.6.3/include/linux/dcache.h 2004-02-21 00:21:04.612228624 +0800
@@ -25,6 +25,11 @@
#define IS_ROOT(x) ((x) == (x)->d_parent)
+struct dentry_params {
+ unsigned long p_inum;
+ void *p_ptr;
+};
+
/*
* "quick string" -- eases parameter passing, but more importantly
* saves "metadata" about the string (ie length and the hash).
Index: uml-2.6.3/include/linux/ext3_fs.h
===================================================================
--- uml-2.6.3.orig/include/linux/ext3_fs.h 2004-01-09 14:59:44.000000000 +0800
+++ uml-2.6.3/include/linux/ext3_fs.h 2004-02-21 00:21:04.613228472 +0800
@@ -203,6 +203,7 @@
#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
@@ -707,7 +708,8 @@
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 *);
@@ -792,4 +794,5 @@
#endif /* __KERNEL__ */
+#define EXT3_IOC_CREATE_INUM _IOW('f', 5, long)
#endif /* _LINUX_EXT3_FS_H */
Index: linux-2.6.3/arch/i386/kernel/traps.c
===================================================================
--- linux-2.6.3.orig/arch/i386/kernel/traps.c 2004-02-23 14:04:13.000000000 -0800
+++ linux-2.6.3/arch/i386/kernel/traps.c 2004-02-23 14:10:07.000000000 -0800
@@ -890,3 +890,21 @@
trap_init_hook();
}
+
+int is_kernel_text_address(unsigned long addr)
+{
+ if (addr < (unsigned long) &_stext ||
+ addr > (unsigned long) &_etext ||
+ module_text_address(addr))
+ return 0;
+
+ return 1;
+}
+
+int lookup_symbol(unsigned long address, char *buf, int buflen)
+{
+ return -ENOSYS;
+}
+
+EXPORT_SYMBOL_GPL(is_kernel_text_address);
+EXPORT_SYMBOL_GPL(lookup_symbol);
This diff is collapsed.
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment