Whamcloud - gitweb
Branch b1_6
[fs/lustre-release.git] / ldiskfs / kernel_patches / patches / ext3-ea-in-inode-2.6-suse.patch
index 39fa9ce..dcd87ed 100644 (file)
@@ -1,25 +1,23 @@
 %patch
-Index: linux-2.6.0/fs/ext3/ialloc.c
+Index: linux-2.6.5-7.311/fs/ext3/ialloc.c
 ===================================================================
---- linux-2.6.0.orig/fs/ext3/ialloc.c  2004-01-14 18:54:11.000000000 +0300
-+++ linux-2.6.0/fs/ext3/ialloc.c       2004-01-14 18:54:12.000000000 +0300
-@@ -627,6 +627,11 @@
-       inode->i_generation = EXT3_SB(sb)->s_next_generation++;
+--- linux-2.6.5-7.311.orig/fs/ext3/ialloc.c
++++ linux-2.6.5-7.311/fs/ext3/ialloc.c
+@@ -633,6 +633,9 @@ got:
+       spin_unlock(&sbi->s_next_gen_lock);
  
        ei->i_state = EXT3_STATE_NEW;
-+      if (EXT3_INODE_SIZE(inode->i_sb) > EXT3_GOOD_OLD_INODE_SIZE) {
-+              ei->i_extra_isize = sizeof(__u16)       /* i_extra_isize */
-+                              + sizeof(__u16);        /* i_pad1 */
-+      } else
-+              ei->i_extra_isize = 0;
++      ei->i_extra_isize =
++              (EXT3_INODE_SIZE(inode->i_sb) > EXT3_GOOD_OLD_INODE_SIZE) ?
++              sizeof(struct ext3_inode) - EXT3_GOOD_OLD_INODE_SIZE : 0;
  
        ret = inode;
        if(DQUOT_ALLOC_INODE(inode)) {
-Index: linux-2.6.0/fs/ext3/inode.c
+Index: linux-2.6.5-7.311/fs/ext3/inode.c
 ===================================================================
---- linux-2.6.0.orig/fs/ext3/inode.c   2004-01-14 18:54:12.000000000 +0300
-+++ linux-2.6.0/fs/ext3/inode.c        2004-01-14 19:09:46.000000000 +0300
-@@ -2339,7 +2339,7 @@
+--- linux-2.6.5-7.311.orig/fs/ext3/inode.c
++++ linux-2.6.5-7.311/fs/ext3/inode.c
+@@ -2284,7 +2284,7 @@ static unsigned long ext3_get_inode_bloc
   * trying to determine the inode's location on-disk and no read need be
   * performed.
   */
@@ -28,7 +26,7 @@ Index: linux-2.6.0/fs/ext3/inode.c
                                struct ext3_iloc *iloc, int in_mem)
  {
        unsigned long block;
-@@ -2547,6 +2547,11 @@
+@@ -2495,6 +2495,11 @@ void ext3_read_inode(struct inode * inod
                ei->i_data[block] = raw_inode->i_block[block];
        INIT_LIST_HEAD(&ei->i_orphan);
  
@@ -40,7 +38,7 @@ Index: linux-2.6.0/fs/ext3/inode.c
        if (S_ISREG(inode->i_mode)) {
                inode->i_op = &ext3_file_inode_operations;
                inode->i_fop = &ext3_file_operations;
-@@ -2682,6 +2687,9 @@
+@@ -2630,6 +2635,9 @@ static int ext3_do_update_inode(handle_t
        } else for (block = 0; block < EXT3_N_BLOCKS; block++)
                raw_inode->i_block[block] = ei->i_data[block];
  
@@ -50,11 +48,21 @@ Index: linux-2.6.0/fs/ext3/inode.c
        BUFFER_TRACE(bh, "call ext3_journal_dirty_metadata");
        rc = ext3_journal_dirty_metadata(handle, bh);
        if (!err)
-Index: linux-2.6.0/fs/ext3/xattr.c
+@@ -2839,7 +2847,8 @@ ext3_reserve_inode_write(handle_t *handl
+ {
+       int err = 0;
+       if (handle) {
+-              err = ext3_get_inode_loc(inode, iloc, 1);
++              err = ext3_get_inode_loc(inode, iloc, EXT3_I(inode)->i_state &
++                                                      EXT3_STATE_NEW);
+               if (!err) {
+                       BUFFER_TRACE(iloc->bh, "get_write_access");
+                       err = ext3_journal_get_write_access(handle, iloc->bh);
+Index: linux-2.6.5-7.311/fs/ext3/xattr.c
 ===================================================================
---- linux-2.6.0.orig/fs/ext3/xattr.c   2003-12-30 08:33:13.000000000 +0300
-+++ linux-2.6.0/fs/ext3/xattr.c        2004-01-14 18:54:12.000000000 +0300
-@@ -246,17 +246,12 @@
+--- linux-2.6.5-7.311.orig/fs/ext3/xattr.c
++++ linux-2.6.5-7.311/fs/ext3/xattr.c
+@@ -245,17 +245,12 @@ ext3_removexattr(struct dentry *dentry, 
  }
  
  /*
@@ -75,7 +83,7 @@ Index: linux-2.6.0/fs/ext3/xattr.c
               void *buffer, size_t buffer_size)
  {
        struct buffer_head *bh = NULL;
-@@ -270,7 +265,6 @@
+@@ -269,7 +264,6 @@ ext3_xattr_get(struct inode *inode, int 
  
        if (name == NULL)
                return -EINVAL;
@@ -83,7 +91,7 @@ Index: linux-2.6.0/fs/ext3/xattr.c
        error = -ENODATA;
        if (!EXT3_I(inode)->i_file_acl)
                goto cleanup;
-@@ -343,15 +337,87 @@
+@@ -342,15 +336,87 @@ found:
  
  cleanup:
        brelse(bh);
@@ -94,7 +102,7 @@ Index: linux-2.6.0/fs/ext3/xattr.c
  
  /*
 - * ext3_xattr_list()
-+ * ext3_xattr_ibode_get()
++ * ext3_xattr_ibody_get()
   *
 - * Copy a list of attribute names into the buffer
 + * routine looks for attribute in inode body and returns it's value and size
@@ -113,7 +121,7 @@ Index: linux-2.6.0/fs/ext3/xattr.c
 +      if (EXT3_SB(inode->i_sb)->s_inode_size <= EXT3_GOOD_OLD_INODE_SIZE)
 +              return -ENOENT;
 +
-+      ret = ext3_get_inode_loc(inode, &iloc);
++      ret = ext3_get_inode_loc(inode, &iloc, 0);
 +      if (ret)
 +              return ret;
 +      raw_inode = ext3_raw_inode(&iloc);
@@ -174,7 +182,7 @@ Index: linux-2.6.0/fs/ext3/xattr.c
   * provided, or compute the buffer size required.
   * Buffer is NULL to compute the size of the buffer required.
   *
-@@ -359,7 +425,31 @@
+@@ -358,7 +424,31 @@ cleanup:
   * used / required on success.
   */
  int
@@ -207,7 +215,7 @@ Index: linux-2.6.0/fs/ext3/xattr.c
  {
        struct buffer_head *bh = NULL;
        struct ext3_xattr_entry *entry;
-@@ -370,7 +460,6 @@
+@@ -369,7 +459,6 @@ ext3_xattr_list(struct inode *inode, cha
        ea_idebug(inode, "buffer=%p, buffer_size=%ld",
                  buffer, (long)buffer_size);
  
@@ -215,16 +223,7 @@ Index: linux-2.6.0/fs/ext3/xattr.c
        error = 0;
        if (!EXT3_I(inode)->i_file_acl)
                goto cleanup;
-@@ -380,7 +469,7 @@
-       if (!bh)
-               goto cleanup;
-       ea_bdebug(bh, "b_count=%d, refcount=%d",
--              atomic_read(&(bh->b_count)), le32_to_cpu(HDR(bh)->h_refcount));
-+              (int) atomic_read(&(bh->b_count)), (int) le32_to_cpu(HDR(bh)->h_refcount));
-       end = bh->b_data + bh->b_size;
-       if (HDR(bh)->h_magic != cpu_to_le32(EXT3_XATTR_MAGIC) ||
-           HDR(bh)->h_blocks != cpu_to_le32(1)) {
-@@ -431,11 +520,138 @@
+@@ -430,11 +519,138 @@ bad_block:      ext3_error(inode->i_sb, "ext3
  
  cleanup:
        brelse(bh);
@@ -251,7 +250,7 @@ Index: linux-2.6.0/fs/ext3/xattr.c
 +      if (EXT3_SB(inode->i_sb)->s_inode_size <= EXT3_GOOD_OLD_INODE_SIZE)
 +              return 0;
 +
-+      ret = ext3_get_inode_loc(inode, &iloc);
++      ret = ext3_get_inode_loc(inode, &iloc, 0);
 +      if (ret)
 +              return ret;
 +      raw_inode = ext3_raw_inode(&iloc);
@@ -364,7 +363,7 @@ Index: linux-2.6.0/fs/ext3/xattr.c
  /*
   * If the EXT3_FEATURE_COMPAT_EXT_ATTR feature of this file system is
   * not set, set it.
-@@ -457,6 +673,279 @@
+@@ -456,6 +672,279 @@ static void ext3_xattr_update_super_bloc
  }
  
  /*
@@ -388,7 +387,7 @@ Index: linux-2.6.0/fs/ext3/xattr.c
 +      if (EXT3_SB(inode->i_sb)->s_inode_size <= EXT3_GOOD_OLD_INODE_SIZE)
 +              return ret;
 +
-+      err = ext3_get_inode_loc(inode, &iloc);
++      err = ext3_get_inode_loc(inode, &iloc, 0);
 +      if (err)
 +              return -EIO;
 +      raw_inode = ext3_raw_inode(&iloc);
@@ -519,7 +518,7 @@ Index: linux-2.6.0/fs/ext3/xattr.c
 +      if (EXT3_SB(inode->i_sb)->s_inode_size <= EXT3_GOOD_OLD_INODE_SIZE)
 +              return -ENOSPC;
 +
-+      err = ext3_get_inode_loc(inode, &iloc);
++      err = ext3_get_inode_loc(inode, &iloc, 0);
 +      if (err)
 +              return err;
 +      raw_inode = ext3_raw_inode(&iloc);
@@ -618,17 +617,17 @@ Index: linux-2.6.0/fs/ext3/xattr.c
 +      if (value) {
 +              int offs = min_offs - value_len;
 +              /* use last to create new entry */
++              memset(last, 0, esize);
 +              last->e_name_len = strlen(name);
 +              last->e_name_index = name_index;
 +              last->e_value_offs = cpu_to_le16(offs);
 +              last->e_value_size = cpu_to_le32(value_len);
 +              last->e_hash = last->e_value_block = 0;
-+              memset(last->e_name, 0, esize);
 +              memcpy(last->e_name, name, last->e_name_len);
 +              if (start + offs + value_len > end)
-+                      printk("ALERT at %s:%d: 0x%p + %d + %d > 0x%p\n",
-+                                      __FILE__, __LINE__, start, offs,
-+                                      value_len, end);
++                      printk("ALERT at %s:%d: 0x%p + %d + %zd > 0x%p\n",
++                             __FILE__, __LINE__, start, offs,
++                             value_len, end);
 +              memcpy(start + offs, value, value_len);
 +              last = EXT3_XATTR_NEXT(last);
 +              *((__u32 *) last) = 0;
@@ -644,7 +643,7 @@ Index: linux-2.6.0/fs/ext3/xattr.c
   * ext3_xattr_set_handle()
   *
   * Create, replace or remove an extended attribute for this inode. Buffer
-@@ -470,6 +959,104 @@
+@@ -469,6 +958,110 @@ static void ext3_xattr_update_super_bloc
   */
  int
  ext3_xattr_set_handle(handle_t *handle, struct inode *inode, int name_index,
@@ -701,6 +700,9 @@ Index: linux-2.6.0/fs/ext3/xattr.c
 +      } else if (!found && (flags & XATTR_REPLACE)) {
 +              err = -ENODATA;
 +              goto finish;
++      } else if (!found && !value) {
++              err = 0;
++              goto finish;
 +      }
 +
 +      /* check if we have enough space to store attribute */
@@ -724,14 +726,17 @@ Index: linux-2.6.0/fs/ext3/xattr.c
 +              }
 +      }
 +
-+      /* try to store EA in inode body */
-+      err = ext3_xattr_ibody_set(handle, inode, name_index, name,
-+                              value, value_len, flags);
-+      if (err) {
-+              /* can't store EA in inode body */
-+              /* try to store in block */
-+              err = ext3_xattr_block_set(handle, inode, name_index,
-+                                      name, value, value_len, flags); 
++      /* Add entry if value is provided */
++      if (value != NULL) {
++              /* try to store EA in inode body */
++              err = ext3_xattr_ibody_set(handle, inode, name_index, name,
++                                      value, value_len, flags);
++              if (err) {
++                      /* can't store EA in inode body */
++                      /* try to store in block */
++                      err = ext3_xattr_block_set(handle, inode, name_index,
++                                              name, value, value_len, flags);
++              }
 +      }
 +
 +finish:       
@@ -749,7 +754,7 @@ Index: linux-2.6.0/fs/ext3/xattr.c
                      const char *name, const void *value, size_t value_len,
                      int flags)
  {
-@@ -492,22 +1078,7 @@
+@@ -491,22 +1084,7 @@ ext3_xattr_set_handle(handle_t *handle, 
         *             towards the end of the block).
         * end -- Points right after the block pointed to by header.
         */
@@ -772,7 +777,7 @@ Index: linux-2.6.0/fs/ext3/xattr.c
        if (EXT3_I(inode)->i_file_acl) {
                /* The inode already has an extended attribute block. */
                bh = sb_bread(sb, EXT3_I(inode)->i_file_acl);
-@@ -733,7 +1304,6 @@
+@@ -730,7 +1308,6 @@ cleanup:
        brelse(bh);
        if (!(bh && header == HDR(bh)))
                kfree(header);
@@ -780,11 +785,11 @@ Index: linux-2.6.0/fs/ext3/xattr.c
  
        return error;
  }
-Index: linux-2.6.0/fs/ext3/xattr.h
+Index: linux-2.6.5-7.311/fs/ext3/xattr.h
 ===================================================================
---- linux-2.6.0.orig/fs/ext3/xattr.h   2003-06-24 18:04:43.000000000 +0400
-+++ linux-2.6.0/fs/ext3/xattr.h        2004-01-14 18:54:12.000000000 +0300
-@@ -77,7 +77,8 @@
+--- linux-2.6.5-7.311.orig/fs/ext3/xattr.h
++++ linux-2.6.5-7.311/fs/ext3/xattr.h
+@@ -77,7 +77,8 @@ extern int ext3_removexattr(struct dentr
  extern int ext3_xattr_get(struct inode *, int, const char *, void *, size_t);
  extern int ext3_xattr_list(struct inode *, char *, size_t);
  extern int ext3_xattr_set(struct inode *, int, const char *, const void *, size_t, int);
@@ -794,11 +799,11 @@ Index: linux-2.6.0/fs/ext3/xattr.h
  
  extern void ext3_xattr_delete_inode(handle_t *, struct inode *);
  extern void ext3_xattr_put_super(struct super_block *);
-Index: linux-2.6.0/include/linux/ext3_fs.h
+Index: linux-2.6.5-7.311/include/linux/ext3_fs.h
 ===================================================================
---- linux-2.6.0.orig/include/linux/ext3_fs.h   2004-01-14 18:54:11.000000000 +0300
-+++ linux-2.6.0/include/linux/ext3_fs.h        2004-01-14 18:54:12.000000000 +0300
-@@ -265,6 +265,8 @@
+--- linux-2.6.5-7.311.orig/include/linux/ext3_fs.h
++++ linux-2.6.5-7.311/include/linux/ext3_fs.h
+@@ -267,6 +267,8 @@ struct ext3_inode {
                        __u32   m_i_reserved2[2];
                } masix2;
        } osd2;                         /* OS dependent 2 */
@@ -807,11 +812,19 @@ Index: linux-2.6.0/include/linux/ext3_fs.h
  };
  
  #define i_size_high   i_dir_acl
-Index: linux-2.6.0/include/linux/ext3_fs_i.h
+@@ -729,6 +731,7 @@ extern unsigned long ext3_count_free (st
+ extern int ext3_forget(handle_t *, int, struct inode *, struct buffer_head *, int);
+ extern struct buffer_head * ext3_getblk (handle_t *, struct inode *, long, int, int *);
+ extern struct buffer_head * ext3_bread (handle_t *, struct inode *, int, int, int *);
++int ext3_get_inode_loc(struct inode *inode, struct ext3_iloc *iloc, int in_mem);
+ extern void ext3_read_inode (struct inode *);
+ extern void ext3_write_inode (struct inode *, int);
+Index: linux-2.6.5-7.311/include/linux/ext3_fs_i.h
 ===================================================================
---- linux-2.6.0.orig/include/linux/ext3_fs_i.h 2003-12-30 08:32:44.000000000 +0300
-+++ linux-2.6.0/include/linux/ext3_fs_i.h      2004-01-14 18:54:12.000000000 +0300
-@@ -96,6 +96,9 @@
+--- linux-2.6.5-7.311.orig/include/linux/ext3_fs_i.h
++++ linux-2.6.5-7.311/include/linux/ext3_fs_i.h
+@@ -113,6 +113,9 @@ struct ext3_inode_info {
         */
        loff_t  i_disksize;
  
@@ -821,13 +834,3 @@ Index: linux-2.6.0/include/linux/ext3_fs_i.h
        /*
         * truncate_sem is for serialising ext3_truncate() against
         * ext3_getblock().  In the 2.4 ext2 design, great chunks of inode's
-
-%diffstat
- fs/ext3/ialloc.c          |    5 
- fs/ext3/inode.c           |   10 
- fs/ext3/xattr.c           |  634 +++++++++++++++++++++++++++++++++++++++++++---
- fs/ext3/xattr.h           |    3 
- include/linux/ext3_fs.h   |    2 
- include/linux/ext3_fs_i.h |    3 
- 6 files changed, 623 insertions(+), 34 deletions(-)
-