void btrfs_set_##bits(struct extent_buffer *eb, void *ptr,             \
                      unsigned long off, u##bits val)                   \
 {                                                                      \
-       unsigned long part_offset = (unsigned long)ptr;                 \
-       unsigned long offset = part_offset + off;                       \
-       void *p;                                                        \
-       int err;                                                        \
-       char *kaddr;                                                    \
-       unsigned long map_start;                                        \
-       unsigned long map_len;                                          \
-       int size = sizeof(u##bits);                                     \
+       const unsigned long member_offset = (unsigned long)ptr + off;   \
+       const unsigned long oip = offset_in_page(member_offset);        \
+       const int size = sizeof(u##bits);                               \
+       __le##bits leres;                                               \
                                                                        \
        ASSERT(check_setget_bounds(eb, ptr, off, size));                \
-       err = map_private_extent_buffer(eb, offset, size,               \
-                       &kaddr, &map_start, &map_len);                  \
-       if (err) {                                                      \
-               __le##bits val2;                                        \
-                                                                       \
-               val2 = cpu_to_le##bits(val);                            \
-               write_extent_buffer(eb, &val2, offset, size);           \
+       if (oip + size <= PAGE_SIZE) {                                  \
+               const unsigned long idx = member_offset >> PAGE_SHIFT;  \
+               char *kaddr = page_address(eb->pages[idx]);             \
+               put_unaligned_le##bits(val, kaddr + oip);               \
                return;                                                 \
        }                                                               \
-       p = kaddr + part_offset - map_start;                            \
-       put_unaligned_le##bits(val, p + off);                           \
+       leres = cpu_to_le##bits(val);                                   \
+       write_extent_buffer(eb, &leres, member_offset, size);           \
 }
 
 DEFINE_BTRFS_SETGET_BITS(8)