Lines Matching defs:loc
134 int (*xlo_journal_access)(handle_t *handle, struct ocfs2_xa_loc *loc,
136 void (*xlo_journal_dirty)(handle_t *handle, struct ocfs2_xa_loc *loc);
139 * Return a pointer to the appropriate buffer in loc->xl_storage
140 * at the given offset from loc->xl_header.
142 void *(*xlo_offset_pointer)(struct ocfs2_xa_loc *loc, int offset);
145 int (*xlo_can_reuse)(struct ocfs2_xa_loc *loc,
149 int (*xlo_check_space)(struct ocfs2_xa_loc *loc,
156 int (*xlo_get_free_start)(struct ocfs2_xa_loc *loc);
162 void (*xlo_wipe_namevalue)(struct ocfs2_xa_loc *loc);
165 void (*xlo_add_entry)(struct ocfs2_xa_loc *loc, u32 name_hash);
168 void (*xlo_add_namevalue)(struct ocfs2_xa_loc *loc, int size);
174 void (*xlo_fill_value_buf)(struct ocfs2_xa_loc *loc,
1445 static int ocfs2_xa_journal_access(handle_t *handle, struct ocfs2_xa_loc *loc,
1448 return loc->xl_ops->xlo_journal_access(handle, loc, type);
1451 static void ocfs2_xa_journal_dirty(handle_t *handle, struct ocfs2_xa_loc *loc)
1453 loc->xl_ops->xlo_journal_dirty(handle, loc);
1457 static void *ocfs2_xa_offset_pointer(struct ocfs2_xa_loc *loc, int offset)
1459 BUG_ON(offset >= loc->xl_size);
1460 return loc->xl_ops->xlo_offset_pointer(loc, offset);
1468 static void ocfs2_xa_wipe_namevalue(struct ocfs2_xa_loc *loc)
1470 loc->xl_ops->xlo_wipe_namevalue(loc);
1477 static int ocfs2_xa_get_free_start(struct ocfs2_xa_loc *loc)
1479 return loc->xl_ops->xlo_get_free_start(loc);
1482 /* Can we reuse loc->xl_entry for xi? */
1483 static int ocfs2_xa_can_reuse_entry(struct ocfs2_xa_loc *loc,
1486 return loc->xl_ops->xlo_can_reuse(loc, xi);
1490 static int ocfs2_xa_check_space(struct ocfs2_xa_loc *loc,
1493 return loc->xl_ops->xlo_check_space(loc, xi);
1496 static void ocfs2_xa_add_entry(struct ocfs2_xa_loc *loc, u32 name_hash)
1498 loc->xl_ops->xlo_add_entry(loc, name_hash);
1499 loc->xl_entry->xe_name_hash = cpu_to_le32(name_hash);
1505 loc->xl_entry->xe_name_offset = cpu_to_le16(loc->xl_size);
1508 static void ocfs2_xa_add_namevalue(struct ocfs2_xa_loc *loc,
1515 loc->xl_ops->xlo_add_namevalue(loc, size);
1516 loc->xl_entry->xe_value_size = cpu_to_le64(xi->xi_value_len);
1517 loc->xl_entry->xe_name_len = xi->xi_name_len;
1518 ocfs2_xattr_set_type(loc->xl_entry, xi->xi_name_index);
1519 ocfs2_xattr_set_local(loc->xl_entry,
1522 nameval_offset = le16_to_cpu(loc->xl_entry->xe_name_offset);
1523 nameval_buf = ocfs2_xa_offset_pointer(loc, nameval_offset);
1528 static void ocfs2_xa_fill_value_buf(struct ocfs2_xa_loc *loc,
1531 int nameval_offset = le16_to_cpu(loc->xl_entry->xe_name_offset);
1532 int name_size = OCFS2_XATTR_SIZE(loc->xl_entry->xe_name_len);
1535 BUG_ON(ocfs2_xattr_is_local(loc->xl_entry));
1536 BUG_ON(namevalue_size_xe(loc->xl_entry) !=
1539 loc->xl_ops->xlo_fill_value_buf(loc, vb);
1541 (struct ocfs2_xattr_value_root *)ocfs2_xa_offset_pointer(loc,
1547 struct ocfs2_xa_loc *loc, int type)
1549 struct buffer_head *bh = loc->xl_storage;
1552 if (loc->xl_size == (bh->b_size -
1558 return access(handle, INODE_CACHE(loc->xl_inode), bh, type);
1562 struct ocfs2_xa_loc *loc)
1564 struct buffer_head *bh = loc->xl_storage;
1569 static void *ocfs2_xa_block_offset_pointer(struct ocfs2_xa_loc *loc,
1572 return (char *)loc->xl_header + offset;
1575 static int ocfs2_xa_block_can_reuse(struct ocfs2_xa_loc *loc,
1582 return namevalue_size_xe(loc->xl_entry) ==
1586 static int ocfs2_xa_block_get_free_start(struct ocfs2_xa_loc *loc)
1588 struct ocfs2_xattr_header *xh = loc->xl_header;
1590 int offset, free_start = loc->xl_size;
1601 static int ocfs2_xa_block_check_space(struct ocfs2_xa_loc *loc,
1604 int count = le16_to_cpu(loc->xl_header->xh_count);
1605 int free_start = ocfs2_xa_get_free_start(loc);
1613 if (loc->xl_entry) {
1615 if (ocfs2_xa_can_reuse_entry(loc, xi))
1618 needed_space -= ocfs2_xe_entry_usage(loc->xl_entry);
1629 static void ocfs2_xa_block_wipe_namevalue(struct ocfs2_xa_loc *loc)
1633 struct ocfs2_xattr_entry *entry = loc->xl_entry;
1634 struct ocfs2_xattr_header *xh = loc->xl_header;
1639 first_namevalue_offset = ocfs2_xa_get_free_start(loc);
1661 static void ocfs2_xa_block_add_entry(struct ocfs2_xa_loc *loc, u32 name_hash)
1663 int count = le16_to_cpu(loc->xl_header->xh_count);
1664 loc->xl_entry = &(loc->xl_header->xh_entries[count]);
1665 le16_add_cpu(&loc->xl_header->xh_count, 1);
1666 memset(loc->xl_entry, 0, sizeof(struct ocfs2_xattr_entry));
1669 static void ocfs2_xa_block_add_namevalue(struct ocfs2_xa_loc *loc, int size)
1671 int free_start = ocfs2_xa_get_free_start(loc);
1673 loc->xl_entry->xe_name_offset = cpu_to_le16(free_start - size);
1676 static void ocfs2_xa_block_fill_value_buf(struct ocfs2_xa_loc *loc,
1679 struct buffer_head *bh = loc->xl_storage;
1681 if (loc->xl_size == (bh->b_size -
1708 struct ocfs2_xa_loc *loc, int type)
1710 struct ocfs2_xattr_bucket *bucket = loc->xl_storage;
1716 struct ocfs2_xa_loc *loc)
1718 struct ocfs2_xattr_bucket *bucket = loc->xl_storage;
1723 static void *ocfs2_xa_bucket_offset_pointer(struct ocfs2_xa_loc *loc,
1726 struct ocfs2_xattr_bucket *bucket = loc->xl_storage;
1730 block = offset >> loc->xl_inode->i_sb->s_blocksize_bits;
1731 block_offset = offset % loc->xl_inode->i_sb->s_blocksize;
1736 static int ocfs2_xa_bucket_can_reuse(struct ocfs2_xa_loc *loc,
1739 return namevalue_size_xe(loc->xl_entry) >=
1743 static int ocfs2_xa_bucket_get_free_start(struct ocfs2_xa_loc *loc)
1745 struct ocfs2_xattr_bucket *bucket = loc->xl_storage;
1763 static int ocfs2_xa_bucket_check_space(struct ocfs2_xa_loc *loc,
1767 int count = le16_to_cpu(loc->xl_header->xh_count);
1768 int free_start = ocfs2_xa_get_free_start(loc);
1771 struct super_block *sb = loc->xl_inode->i_sb;
1779 if (loc->xl_entry) {
1781 if (ocfs2_xa_can_reuse_entry(loc, xi))
1808 static void ocfs2_xa_bucket_wipe_namevalue(struct ocfs2_xa_loc *loc)
1810 le16_add_cpu(&loc->xl_header->xh_name_value_len,
1811 -namevalue_size_xe(loc->xl_entry));
1814 static void ocfs2_xa_bucket_add_entry(struct ocfs2_xa_loc *loc, u32 name_hash)
1816 struct ocfs2_xattr_header *xh = loc->xl_header;
1845 loc->xl_entry = &xh->xh_entries[low];
1846 memset(loc->xl_entry, 0, sizeof(struct ocfs2_xattr_entry));
1849 static void ocfs2_xa_bucket_add_namevalue(struct ocfs2_xa_loc *loc, int size)
1851 int free_start = ocfs2_xa_get_free_start(loc);
1852 struct ocfs2_xattr_header *xh = loc->xl_header;
1853 struct super_block *sb = loc->xl_inode->i_sb;
1858 loc->xl_entry->xe_name_offset = cpu_to_le16(nameval_offset);
1864 static void ocfs2_xa_bucket_fill_value_buf(struct ocfs2_xa_loc *loc,
1867 struct ocfs2_xattr_bucket *bucket = loc->xl_storage;
1868 struct super_block *sb = loc->xl_inode->i_sb;
1869 int nameval_offset = le16_to_cpu(loc->xl_entry->xe_name_offset);
1870 int size = namevalue_size_xe(loc->xl_entry);
1897 static unsigned int ocfs2_xa_value_clusters(struct ocfs2_xa_loc *loc)
1901 if (ocfs2_xattr_is_local(loc->xl_entry))
1904 ocfs2_xa_fill_value_buf(loc, &vb);
1908 static int ocfs2_xa_value_truncate(struct ocfs2_xa_loc *loc, u64 bytes,
1914 ocfs2_xa_fill_value_buf(loc, &vb);
1915 trunc_rc = ocfs2_xattr_value_truncate(loc->xl_inode, &vb, bytes,
1920 * ocfs2_xa_journal_access on the loc. However, The truncate code
1928 access_rc = ocfs2_xa_journal_access(ctxt->handle, loc,
1935 static void ocfs2_xa_remove_entry(struct ocfs2_xa_loc *loc)
1938 struct ocfs2_xattr_header *xh = loc->xl_header;
1939 struct ocfs2_xattr_entry *entry = loc->xl_entry;
1941 ocfs2_xa_wipe_namevalue(loc);
1942 loc->xl_entry = NULL;
1986 static void ocfs2_xa_cleanup_value_truncate(struct ocfs2_xa_loc *loc,
1990 unsigned int new_clusters = ocfs2_xa_value_clusters(loc);
1991 char *nameval_buf = ocfs2_xa_offset_pointer(loc,
1992 le16_to_cpu(loc->xl_entry->xe_name_offset));
1998 what, loc->xl_entry->xe_name_len, nameval_buf,
2000 ocfs2_xa_remove_entry(loc);
2006 loc->xl_entry->xe_name_len, nameval_buf,
2008 ocfs2_xa_remove_entry(loc);
2014 loc->xl_entry->xe_name_len, nameval_buf,
2018 static int ocfs2_xa_remove(struct ocfs2_xa_loc *loc,
2024 if (!ocfs2_xattr_is_local(loc->xl_entry)) {
2025 orig_clusters = ocfs2_xa_value_clusters(loc);
2026 rc = ocfs2_xa_value_truncate(loc, 0, ctxt);
2035 if (orig_clusters != ocfs2_xa_value_clusters(loc))
2037 ocfs2_xa_cleanup_value_truncate(loc, "removing",
2043 ocfs2_xa_remove_entry(loc);
2049 static void ocfs2_xa_install_value_root(struct ocfs2_xa_loc *loc)
2051 int name_size = OCFS2_XATTR_SIZE(loc->xl_entry->xe_name_len);
2054 nameval_buf = ocfs2_xa_offset_pointer(loc,
2055 le16_to_cpu(loc->xl_entry->xe_name_offset));
2064 static int ocfs2_xa_reuse_entry(struct ocfs2_xa_loc *loc,
2072 int xe_local = ocfs2_xattr_is_local(loc->xl_entry);
2075 BUG_ON(OCFS2_XATTR_SIZE(loc->xl_entry->xe_name_len) !=
2078 nameval_buf = ocfs2_xa_offset_pointer(loc,
2079 le16_to_cpu(loc->xl_entry->xe_name_offset));
2082 namevalue_size_xe(loc->xl_entry) - name_size);
2084 ocfs2_xa_install_value_root(loc);
2086 orig_clusters = ocfs2_xa_value_clusters(loc);
2088 rc = ocfs2_xa_value_truncate(loc, 0, ctxt);
2093 namevalue_size_xe(loc->xl_entry) -
2095 } else if (le64_to_cpu(loc->xl_entry->xe_value_size) >
2097 rc = ocfs2_xa_value_truncate(loc, xi->xi_value_len,
2104 ocfs2_xa_cleanup_value_truncate(loc, "reusing",
2110 loc->xl_entry->xe_value_size = cpu_to_le64(xi->xi_value_len);
2111 ocfs2_xattr_set_local(loc->xl_entry, xi_local);
2118 * Prepares loc->xl_entry to receive the new xattr. This includes
2119 * properly setting up the name+value pair region. If loc->xl_entry
2125 static int ocfs2_xa_prepare_entry(struct ocfs2_xa_loc *loc,
2134 rc = ocfs2_xa_check_space(loc, xi);
2138 if (loc->xl_entry) {
2139 if (ocfs2_xa_can_reuse_entry(loc, xi)) {
2140 orig_value_size = loc->xl_entry->xe_value_size;
2141 rc = ocfs2_xa_reuse_entry(loc, xi, ctxt);
2147 if (!ocfs2_xattr_is_local(loc->xl_entry)) {
2148 orig_clusters = ocfs2_xa_value_clusters(loc);
2149 rc = ocfs2_xa_value_truncate(loc, 0, ctxt);
2152 ocfs2_xa_cleanup_value_truncate(loc,
2158 ocfs2_xa_wipe_namevalue(loc);
2160 ocfs2_xa_add_entry(loc, name_hash);
2166 ocfs2_xa_add_namevalue(loc, xi);
2168 ocfs2_xa_install_value_root(loc);
2172 orig_clusters = ocfs2_xa_value_clusters(loc);
2173 rc = ocfs2_xa_value_truncate(loc, xi->xi_value_len, ctxt);
2176 ocfs2_xa_cleanup_value_truncate(loc, "growing",
2184 if (loc->xl_entry) {
2186 loc->xl_entry->xe_value_size = orig_value_size;
2201 static int ocfs2_xa_store_value(struct ocfs2_xa_loc *loc,
2206 int nameval_offset = le16_to_cpu(loc->xl_entry->xe_name_offset);
2211 nameval_buf = ocfs2_xa_offset_pointer(loc, nameval_offset);
2213 ocfs2_xa_fill_value_buf(loc, &vb);
2214 rc = __ocfs2_xattr_set_value_outside(loc->xl_inode,
2224 static int ocfs2_xa_set(struct ocfs2_xa_loc *loc,
2229 u32 name_hash = ocfs2_xattr_name_hash(loc->xl_inode, xi->xi_name,
2232 ret = ocfs2_xa_journal_access(ctxt->handle, loc,
2247 ret = ocfs2_xa_remove(loc, ctxt);
2251 ret = ocfs2_xa_prepare_entry(loc, xi, name_hash, ctxt);
2258 ret = ocfs2_xa_store_value(loc, xi, ctxt);
2263 ocfs2_xa_journal_dirty(ctxt->handle, loc);
2269 static void ocfs2_init_dinode_xa_loc(struct ocfs2_xa_loc *loc,
2278 loc->xl_inode = inode;
2279 loc->xl_ops = &ocfs2_xa_block_loc_ops;
2280 loc->xl_storage = bh;
2281 loc->xl_entry = entry;
2282 loc->xl_size = le16_to_cpu(di->i_xattr_inline_size);
2283 loc->xl_header =
2285 loc->xl_size);
2288 static void ocfs2_init_xattr_block_xa_loc(struct ocfs2_xa_loc *loc,
2298 loc->xl_inode = inode;
2299 loc->xl_ops = &ocfs2_xa_block_loc_ops;
2300 loc->xl_storage = bh;
2301 loc->xl_header = &(xb->xb_attrs.xb_header);
2302 loc->xl_entry = entry;
2303 loc->xl_size = bh->b_size - offsetof(struct ocfs2_xattr_block,
2307 static void ocfs2_init_xattr_bucket_xa_loc(struct ocfs2_xa_loc *loc,
2311 loc->xl_inode = bucket->bu_inode;
2312 loc->xl_ops = &ocfs2_xa_bucket_loc_ops;
2313 loc->xl_storage = bucket;
2314 loc->xl_header = bucket_xh(bucket);
2315 loc->xl_entry = entry;
2316 loc->xl_size = OCFS2_XATTR_BUCKET_SIZE;
2778 struct ocfs2_xa_loc loc;
2793 ocfs2_init_dinode_xa_loc(&loc, inode, xs->inode_bh,
2795 ret = ocfs2_xa_set(&loc, xi, ctxt);
2801 xs->here = loc.xl_entry;
2962 struct ocfs2_xa_loc loc;
2982 ocfs2_init_xattr_block_xa_loc(&loc, inode, xs->xattr_bh,
2985 ret = ocfs2_xa_set(&loc, xi, ctxt);
2987 xs->here = loc.xl_entry;
5543 struct ocfs2_xa_loc loc;
5547 ocfs2_init_xattr_bucket_xa_loc(&loc, xs->bucket,
5549 ret = ocfs2_xa_set(&loc, xi, ctxt);
5551 xs->here = loc.xl_entry;
5567 ret = ocfs2_xa_set(&loc, xi, ctxt);
5569 xs->here = loc.xl_entry;