goto out_brelse;
}
+ if (ei->i_state & EXT3_STATE_NEW)
-+ memset(raw_inode, 0, EXT3_INODE_SIZE(inode->i_sb));
++ memset(raw_inode, 0, EXT3_INODE_SIZE(inode->i_sb));
raw_inode->i_mode = cpu_to_le16(inode->i_mode);
if(!(test_opt(inode->i_sb, NO_UID32))) {
raw_inode->i_uid_low = cpu_to_le16(low_16_bits(inode->i_uid));
+ /* try to find attribute in inode body */
+ err = ext3_xattr_ibody_get(inode, name_index, name,
+ buffer, buffer_size);
-+ if (err < 0)
++ if (err < 0)
+ /* search was unsuccessful, try to find EA in dedicated block */
+ err = ext3_xattr_block_get(inode, name_index, name,
+ buffer, buffer_size);
+ return 0;
+
+ ret = ext3_get_inode_loc(inode, &iloc);
-+ if (ret)
++ if (ret)
+ return ret;
+ raw_inode = iloc.raw_inode;
+
+ /* get list of attributes stored in inode body */
+ error = ext3_xattr_ibody_list(inode, buffer, buffer_size);
+ if (error < 0) {
-+ /* some error occured while collecting
++ /* some error occured while collecting
+ * attributes in inode body */
+ size = 0;
+ goto cleanup;
+ if (buffer_size <= 0) {
+ buffer = NULL;
+ buffer_size = 0;
-+ } else
++ } else
+ buffer += error;
+ }
+
+ error = ext3_xattr_block_list(inode, buffer, buffer_size);
-+ if (error < 0)
++ if (error < 0)
+ /* listing was successful, so we return len */
+ size = 0;
+
+ * NOTE: free space includes space our attribute hold
+ */
+int
-+ext3_xattr_ibody_find(struct inode *inode, int name_index,
++ext3_xattr_ibody_find(struct inode *inode, int name_index,
+ const char *name, struct ext3_xattr_entry *rentry, int *free)
+{
+ struct ext3_xattr_entry *last;
+ return ret;
+
+ err = ext3_get_inode_loc(inode, &iloc);
-+ if (err)
++ if (err)
+ return -EIO;
+ raw_inode = iloc.raw_inode;
+
+
+/*
+ * ext3_xattr_inode_set()
-+ *
++ *
+ * this routine add/remove/replace attribute in inode body
+ */
+int
+ }
+ if (name_index == last->e_name_index &&
+ name_len == last->e_name_len &&
-+ !memcmp(name, last->e_name, name_len))
++ !memcmp(name, last->e_name, name_len))
+ here = last;
+ else {
+ /* we calculate all but our attribute
+ e = (struct ext3_xattr_entry *) start;
+ while (!IS_LAST_ENTRY(e)) {
+ struct ext3_xattr_entry *next = EXT3_XATTR_NEXT(e);
-+ int offs = le16_to_cpu(e->e_value_offs);
-+ if (offs < border)
-+ e->e_value_offs =
++ int offs = le16_to_cpu(e->e_value_offs);
++ if (offs < border)
++ e->e_value_offs =
+ cpu_to_le16(offs + size);
+ e = next;
+ }
* ext3_xattr_set()
*
* Create, replace or remove an extended attribute for this inode. Buffer
-@@ -583,6 +1067,100 @@ static void ext3_xattr_update_super_bloc
+@@ -583,6 +1067,101 @@ static void ext3_xattr_update_super_bloc
*/
int
ext3_xattr_set(handle_t *handle, struct inode *inode, int name_index,
+ if (err != 0 && err != -ENOENT) {
+ /* not found EA in block */
+ goto finish;
++ } else if (err == 0) {
++ /* found EA in block */
++ where = 1;
++ found = 1;
+ }
-+ /* found EA in block */
-+ where = 1;
-+ found = 1;
+ } else
+ goto finish;
+
+
+/*
+ * ext3_xattr_block_set()
-+ *
++ *
+ * this routine add/remove/replace attribute in EA block
+ */
+int
*/
loff_t i_disksize;
-+ /* on-disk additional lenght */
++ /* on-disk additional length */
+ __u16 i_extra_isize;
+
/*