f2fs: fix to adapt small inline xattr space in __find_inline_xattr()
[linux-2.6-block.git] / fs / f2fs / xattr.c
index ca47224d78ab7a0210b2bd6ff5357aa34f24dd03..848a785abe253c0bfea21644407a842f317ea4b7 100644 (file)
@@ -224,11 +224,11 @@ static struct f2fs_xattr_entry *__find_inline_xattr(struct inode *inode,
 {
        struct f2fs_xattr_entry *entry;
        unsigned int inline_size = inline_xattr_size(inode);
+       void *max_addr = base_addr + inline_size;
 
        list_for_each_xattr(entry, base_addr) {
-               if ((void *)entry + sizeof(__u32) > base_addr + inline_size ||
-                       (void *)XATTR_NEXT_ENTRY(entry) + sizeof(__u32) >
-                       base_addr + inline_size) {
+               if ((void *)entry + sizeof(__u32) > max_addr ||
+                       (void *)XATTR_NEXT_ENTRY(entry) > max_addr) {
                        *last_addr = entry;
                        return NULL;
                }
@@ -239,6 +239,13 @@ static struct f2fs_xattr_entry *__find_inline_xattr(struct inode *inode,
                if (!memcmp(entry->e_name, name, len))
                        break;
        }
+
+       /* inline xattr header or entry across max inline xattr size */
+       if (IS_XATTR_LAST_ENTRY(entry) &&
+               (void *)entry + sizeof(__u32) > max_addr) {
+               *last_addr = entry;
+               return NULL;
+       }
        return entry;
 }