ext4: zero out inline data using memset() instead of empty_zero_page
authorTheodore Ts'o <tytso@mit.edu>
Tue, 11 Dec 2012 08:31:49 +0000 (03:31 -0500)
committerTheodore Ts'o <tytso@mit.edu>
Tue, 11 Dec 2012 08:31:49 +0000 (03:31 -0500)
Not all architectures (in particular, sparc64) have empty_zero_page.
So instead of copying from empty_zero_page, use memset to clear the
inline data by signalling to ext4_xattr_set_entry() via a magic
pointer value, EXT4_ZERO_ATTR_VALUE, which is defined by casting -1 to
a pointer.

This fixes a build failure on sparc64, and the memset() should be more
efficient than using memcpy() anyway.

Signed-off-by: Tao Ma <boyu.mt@taobao.com>
Signed-off-by: "Theodore Ts'o" <tytso@mit.edu>
fs/ext4/inline.c
fs/ext4/xattr.c
fs/ext4/xattr.h

index 53b2f65091dd05678622c0cf85e93403b8cd5921..387c47c6cda9f529302602ac69d9878feb75689c 100644 (file)
@@ -268,7 +268,7 @@ static int ext4_create_inline_data(handle_t *handle,
                goto out;
 
        if (len > EXT4_MIN_INLINE_DATA_SIZE) {
-               value = (void *)empty_zero_page;
+               value = EXT4_ZERO_XATTR_VALUE;
                len -= EXT4_MIN_INLINE_DATA_SIZE;
        } else {
                value = "";
index 2251769a3c53b9888c877eeaad0aa213530e5ac9..3a91ebc2b66fa6fd2177671146c8c6fdd2e54078 100644 (file)
@@ -628,9 +628,14 @@ ext4_xattr_set_entry(struct ext4_xattr_info *i, struct ext4_xattr_search *s)
                                   size. Just replace. */
                                s->here->e_value_size =
                                        cpu_to_le32(i->value_len);
-                               memset(val + size - EXT4_XATTR_PAD, 0,
-                                      EXT4_XATTR_PAD); /* Clear pad bytes. */
-                               memcpy(val, i->value, i->value_len);
+                               if (i->value == EXT4_ZERO_XATTR_VALUE) {
+                                       memset(val, 0, size);
+                               } else {
+                                       /* Clear pad bytes first. */
+                                       memset(val + size - EXT4_XATTR_PAD, 0,
+                                              EXT4_XATTR_PAD);
+                                       memcpy(val, i->value, i->value_len);
+                               }
                                return 0;
                        }
 
@@ -669,9 +674,14 @@ ext4_xattr_set_entry(struct ext4_xattr_info *i, struct ext4_xattr_search *s)
                        size_t size = EXT4_XATTR_SIZE(i->value_len);
                        void *val = s->base + min_offs - size;
                        s->here->e_value_offs = cpu_to_le16(min_offs - size);
-                       memset(val + size - EXT4_XATTR_PAD, 0,
-                              EXT4_XATTR_PAD); /* Clear the pad bytes. */
-                       memcpy(val, i->value, i->value_len);
+                       if (i->value == EXT4_ZERO_XATTR_VALUE) {
+                               memset(val, 0, size);
+                       } else {
+                               /* Clear the pad bytes first. */
+                               memset(val + size - EXT4_XATTR_PAD, 0,
+                                      EXT4_XATTR_PAD);
+                               memcpy(val, i->value, i->value_len);
+                       }
                }
        }
        return 0;
index 7b5513ed3b386da1d49337139e658bd967849aaa..69eda787a96ab5ff7e26a9c76b298371bdbfb372 100644 (file)
@@ -71,6 +71,7 @@ struct ext4_xattr_entry {
 #define BFIRST(bh) ENTRY(BHDR(bh)+1)
 #define IS_LAST_ENTRY(entry) (*(__u32 *)(entry) == 0)
 
+#define EXT4_ZERO_XATTR_VALUE ((void *)-1)
 
 struct ext4_xattr_info {
        int name_index;