f2fs: Don't update the xattr data that same as the exist
authorKinglong Mee <kinglongmee@gmail.com>
Sat, 25 Feb 2017 11:23:27 +0000 (19:23 +0800)
committerJaegeuk Kim <jaegeuk@kernel.org>
Mon, 27 Feb 2017 18:07:44 +0000 (10:07 -0800)
f2fs removes the old xattr data and appends the new data although
the new data is same as the exist.

Signed-off-by: Kinglong Mee <kinglongmee@gmail.com>
Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
fs/f2fs/xattr.c

index b50f6b581a71b8f256a940f3a4c036992a969ea3..dbfd5cbfa46c5da42341d3f95775057085a3657f 100644 (file)
@@ -545,6 +545,13 @@ cleanup:
        return error;
 }
 
+static bool f2fs_xattr_value_same(struct f2fs_xattr_entry *entry,
+                                       const void *value, size_t size)
+{
+       void *pval = entry->e_name + entry->e_name_len;
+       return (entry->e_value_size == size) && !memcmp(pval, value, size);
+}
+
 static int __f2fs_setxattr(struct inode *inode, int index,
                        const char *name, const void *value, size_t size,
                        struct page *ipage, int flags)
@@ -579,12 +586,17 @@ static int __f2fs_setxattr(struct inode *inode, int index,
 
        found = IS_XATTR_LAST_ENTRY(here) ? 0 : 1;
 
-       if ((flags & XATTR_REPLACE) && !found) {
+       if (found) {
+               if ((flags & XATTR_CREATE)) {
+                       error = -EEXIST;
+                       goto exit;
+               }
+
+               if (f2fs_xattr_value_same(here, value, size))
+                       goto exit;
+       } else if ((flags & XATTR_REPLACE)) {
                error = -ENODATA;
                goto exit;
-       } else if ((flags & XATTR_CREATE) && found) {
-               error = -EEXIST;
-               goto exit;
        }
 
        last = here;