Lines Matching refs: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,
1436 static int ocfs2_xa_journal_access(handle_t *handle, struct ocfs2_xa_loc *loc,
1439 return loc->xl_ops->xlo_journal_access(handle, loc, type);
1442 static void ocfs2_xa_journal_dirty(handle_t *handle, struct ocfs2_xa_loc *loc)
1444 loc->xl_ops->xlo_journal_dirty(handle, loc);
1448 static void *ocfs2_xa_offset_pointer(struct ocfs2_xa_loc *loc, int offset)
1450 BUG_ON(offset >= loc->xl_size);
1451 return loc->xl_ops->xlo_offset_pointer(loc, offset);
1459 static void ocfs2_xa_wipe_namevalue(struct ocfs2_xa_loc *loc)
1461 loc->xl_ops->xlo_wipe_namevalue(loc);
1468 static int ocfs2_xa_get_free_start(struct ocfs2_xa_loc *loc)
1470 return loc->xl_ops->xlo_get_free_start(loc);
1473 /* Can we reuse loc->xl_entry for xi? */
1474 static int ocfs2_xa_can_reuse_entry(struct ocfs2_xa_loc *loc,
1477 return loc->xl_ops->xlo_can_reuse(loc, xi);
1481 static int ocfs2_xa_check_space(struct ocfs2_xa_loc *loc,
1484 return loc->xl_ops->xlo_check_space(loc, xi);
1487 static void ocfs2_xa_add_entry(struct ocfs2_xa_loc *loc, u32 name_hash)
1489 loc->xl_ops->xlo_add_entry(loc, name_hash);
1490 loc->xl_entry->xe_name_hash = cpu_to_le32(name_hash);
1496 loc->xl_entry->xe_name_offset = cpu_to_le16(loc->xl_size);
1499 static void ocfs2_xa_add_namevalue(struct ocfs2_xa_loc *loc,
1506 loc->xl_ops->xlo_add_namevalue(loc, size);
1507 loc->xl_entry->xe_value_size = cpu_to_le64(xi->xi_value_len);
1508 loc->xl_entry->xe_name_len = xi->xi_name_len;
1509 ocfs2_xattr_set_type(loc->xl_entry, xi->xi_name_index);
1510 ocfs2_xattr_set_local(loc->xl_entry,
1513 nameval_offset = le16_to_cpu(loc->xl_entry->xe_name_offset);
1514 nameval_buf = ocfs2_xa_offset_pointer(loc, nameval_offset);
1519 static void ocfs2_xa_fill_value_buf(struct ocfs2_xa_loc *loc,
1522 int nameval_offset = le16_to_cpu(loc->xl_entry->xe_name_offset);
1523 int name_size = OCFS2_XATTR_SIZE(loc->xl_entry->xe_name_len);
1526 BUG_ON(ocfs2_xattr_is_local(loc->xl_entry));
1527 BUG_ON(namevalue_size_xe(loc->xl_entry) !=
1530 loc->xl_ops->xlo_fill_value_buf(loc, vb);
1532 (struct ocfs2_xattr_value_root *)ocfs2_xa_offset_pointer(loc,
1538 struct ocfs2_xa_loc *loc, int type)
1540 struct buffer_head *bh = loc->xl_storage;
1543 if (loc->xl_size == (bh->b_size -
1549 return access(handle, INODE_CACHE(loc->xl_inode), bh, type);
1553 struct ocfs2_xa_loc *loc)
1555 struct buffer_head *bh = loc->xl_storage;
1560 static void *ocfs2_xa_block_offset_pointer(struct ocfs2_xa_loc *loc,
1563 return (char *)loc->xl_header + offset;
1566 static int ocfs2_xa_block_can_reuse(struct ocfs2_xa_loc *loc,
1573 return namevalue_size_xe(loc->xl_entry) ==
1577 static int ocfs2_xa_block_get_free_start(struct ocfs2_xa_loc *loc)
1579 struct ocfs2_xattr_header *xh = loc->xl_header;
1581 int offset, free_start = loc->xl_size;
1592 static int ocfs2_xa_block_check_space(struct ocfs2_xa_loc *loc,
1595 int count = le16_to_cpu(loc->xl_header->xh_count);
1596 int free_start = ocfs2_xa_get_free_start(loc);
1604 if (loc->xl_entry) {
1606 if (ocfs2_xa_can_reuse_entry(loc, xi))
1609 needed_space -= ocfs2_xe_entry_usage(loc->xl_entry);
1620 static void ocfs2_xa_block_wipe_namevalue(struct ocfs2_xa_loc *loc)
1624 struct ocfs2_xattr_entry *entry = loc->xl_entry;
1625 struct ocfs2_xattr_header *xh = loc->xl_header;
1630 first_namevalue_offset = ocfs2_xa_get_free_start(loc);
1652 static void ocfs2_xa_block_add_entry(struct ocfs2_xa_loc *loc, u32 name_hash)
1654 int count = le16_to_cpu(loc->xl_header->xh_count);
1655 loc->xl_entry = &(loc->xl_header->xh_entries[count]);
1656 le16_add_cpu(&loc->xl_header->xh_count, 1);
1657 memset(loc->xl_entry, 0, sizeof(struct ocfs2_xattr_entry));
1660 static void ocfs2_xa_block_add_namevalue(struct ocfs2_xa_loc *loc, int size)
1662 int free_start = ocfs2_xa_get_free_start(loc);
1664 loc->xl_entry->xe_name_offset = cpu_to_le16(free_start - size);
1667 static void ocfs2_xa_block_fill_value_buf(struct ocfs2_xa_loc *loc,
1670 struct buffer_head *bh = loc->xl_storage;
1672 if (loc->xl_size == (bh->b_size -
1699 struct ocfs2_xa_loc *loc, int type)
1701 struct ocfs2_xattr_bucket *bucket = loc->xl_storage;
1707 struct ocfs2_xa_loc *loc)
1709 struct ocfs2_xattr_bucket *bucket = loc->xl_storage;
1714 static void *ocfs2_xa_bucket_offset_pointer(struct ocfs2_xa_loc *loc,
1717 struct ocfs2_xattr_bucket *bucket = loc->xl_storage;
1721 block = offset >> loc->xl_inode->i_sb->s_blocksize_bits;
1722 block_offset = offset % loc->xl_inode->i_sb->s_blocksize;
1727 static int ocfs2_xa_bucket_can_reuse(struct ocfs2_xa_loc *loc,
1730 return namevalue_size_xe(loc->xl_entry) >=
1734 static int ocfs2_xa_bucket_get_free_start(struct ocfs2_xa_loc *loc)
1736 struct ocfs2_xattr_bucket *bucket = loc->xl_storage;
1754 static int ocfs2_xa_bucket_check_space(struct ocfs2_xa_loc *loc,
1758 int count = le16_to_cpu(loc->xl_header->xh_count);
1759 int free_start = ocfs2_xa_get_free_start(loc);
1762 struct super_block *sb = loc->xl_inode->i_sb;
1770 if (loc->xl_entry) {
1772 if (ocfs2_xa_can_reuse_entry(loc, xi))
1799 static void ocfs2_xa_bucket_wipe_namevalue(struct ocfs2_xa_loc *loc)
1801 le16_add_cpu(&loc->xl_header->xh_name_value_len,
1802 -namevalue_size_xe(loc->xl_entry));
1805 static void ocfs2_xa_bucket_add_entry(struct ocfs2_xa_loc *loc, u32 name_hash)
1807 struct ocfs2_xattr_header *xh = loc->xl_header;
1836 loc->xl_entry = &xh->xh_entries[low];
1837 memset(loc->xl_entry, 0, sizeof(struct ocfs2_xattr_entry));
1840 static void ocfs2_xa_bucket_add_namevalue(struct ocfs2_xa_loc *loc, int size)
1842 int free_start = ocfs2_xa_get_free_start(loc);
1843 struct ocfs2_xattr_header *xh = loc->xl_header;
1844 struct super_block *sb = loc->xl_inode->i_sb;
1849 loc->xl_entry->xe_name_offset = cpu_to_le16(nameval_offset);
1855 static void ocfs2_xa_bucket_fill_value_buf(struct ocfs2_xa_loc *loc,
1858 struct ocfs2_xattr_bucket *bucket = loc->xl_storage;
1859 struct super_block *sb = loc->xl_inode->i_sb;
1860 int nameval_offset = le16_to_cpu(loc->xl_entry->xe_name_offset);
1861 int size = namevalue_size_xe(loc->xl_entry);
1888 static unsigned int ocfs2_xa_value_clusters(struct ocfs2_xa_loc *loc)
1892 if (ocfs2_xattr_is_local(loc->xl_entry))
1895 ocfs2_xa_fill_value_buf(loc, &vb);
1899 static int ocfs2_xa_value_truncate(struct ocfs2_xa_loc *loc, u64 bytes,
1905 ocfs2_xa_fill_value_buf(loc, &vb);
1906 trunc_rc = ocfs2_xattr_value_truncate(loc->xl_inode, &vb, bytes,
1911 * ocfs2_xa_journal_access on the loc. However, The truncate code
1919 access_rc = ocfs2_xa_journal_access(ctxt->handle, loc,
1926 static void ocfs2_xa_remove_entry(struct ocfs2_xa_loc *loc)
1929 struct ocfs2_xattr_header *xh = loc->xl_header;
1930 struct ocfs2_xattr_entry *entry = loc->xl_entry;
1932 ocfs2_xa_wipe_namevalue(loc);
1933 loc->xl_entry = NULL;
1977 static void ocfs2_xa_cleanup_value_truncate(struct ocfs2_xa_loc *loc,
1981 unsigned int new_clusters = ocfs2_xa_value_clusters(loc);
1982 char *nameval_buf = ocfs2_xa_offset_pointer(loc,
1983 le16_to_cpu(loc->xl_entry->xe_name_offset));
1989 what, loc->xl_entry->xe_name_len, nameval_buf,
1991 ocfs2_xa_remove_entry(loc);
1997 loc->xl_entry->xe_name_len, nameval_buf,
1999 ocfs2_xa_remove_entry(loc);
2005 loc->xl_entry->xe_name_len, nameval_buf,
2009 static int ocfs2_xa_remove(struct ocfs2_xa_loc *loc,
2015 if (!ocfs2_xattr_is_local(loc->xl_entry)) {
2016 orig_clusters = ocfs2_xa_value_clusters(loc);
2017 rc = ocfs2_xa_value_truncate(loc, 0, ctxt);
2026 if (orig_clusters != ocfs2_xa_value_clusters(loc))
2028 ocfs2_xa_cleanup_value_truncate(loc, "removing",
2035 ocfs2_xa_remove_entry(loc);
2041 static void ocfs2_xa_install_value_root(struct ocfs2_xa_loc *loc)
2043 int name_size = OCFS2_XATTR_SIZE(loc->xl_entry->xe_name_len);
2046 nameval_buf = ocfs2_xa_offset_pointer(loc,
2047 le16_to_cpu(loc->xl_entry->xe_name_offset));
2056 static int ocfs2_xa_reuse_entry(struct ocfs2_xa_loc *loc,
2064 int xe_local = ocfs2_xattr_is_local(loc->xl_entry);
2067 BUG_ON(OCFS2_XATTR_SIZE(loc->xl_entry->xe_name_len) !=
2070 nameval_buf = ocfs2_xa_offset_pointer(loc,
2071 le16_to_cpu(loc->xl_entry->xe_name_offset));
2074 namevalue_size_xe(loc->xl_entry) - name_size);
2076 ocfs2_xa_install_value_root(loc);
2078 orig_clusters = ocfs2_xa_value_clusters(loc);
2080 rc = ocfs2_xa_value_truncate(loc, 0, ctxt);
2085 namevalue_size_xe(loc->xl_entry) -
2087 } else if (le64_to_cpu(loc->xl_entry->xe_value_size) >
2089 rc = ocfs2_xa_value_truncate(loc, xi->xi_value_len,
2096 ocfs2_xa_cleanup_value_truncate(loc, "reusing",
2102 loc->xl_entry->xe_value_size = cpu_to_le64(xi->xi_value_len);
2103 ocfs2_xattr_set_local(loc->xl_entry, xi_local);
2110 * Prepares loc->xl_entry to receive the new xattr. This includes
2111 * properly setting up the name+value pair region. If loc->xl_entry
2117 static int ocfs2_xa_prepare_entry(struct ocfs2_xa_loc *loc,
2126 rc = ocfs2_xa_check_space(loc, xi);
2130 if (loc->xl_entry) {
2131 if (ocfs2_xa_can_reuse_entry(loc, xi)) {
2132 orig_value_size = loc->xl_entry->xe_value_size;
2133 rc = ocfs2_xa_reuse_entry(loc, xi, ctxt);
2139 if (!ocfs2_xattr_is_local(loc->xl_entry)) {
2140 orig_clusters = ocfs2_xa_value_clusters(loc);
2141 rc = ocfs2_xa_value_truncate(loc, 0, ctxt);
2144 ocfs2_xa_cleanup_value_truncate(loc,
2150 ocfs2_xa_wipe_namevalue(loc);
2152 ocfs2_xa_add_entry(loc, name_hash);
2158 ocfs2_xa_add_namevalue(loc, xi);
2160 ocfs2_xa_install_value_root(loc);
2164 orig_clusters = ocfs2_xa_value_clusters(loc);
2165 rc = ocfs2_xa_value_truncate(loc, xi->xi_value_len, ctxt);
2168 ocfs2_xa_cleanup_value_truncate(loc, "growing",
2176 if (loc->xl_entry) {
2178 loc->xl_entry->xe_value_size = orig_value_size;
2193 static int ocfs2_xa_store_value(struct ocfs2_xa_loc *loc,
2198 int nameval_offset = le16_to_cpu(loc->xl_entry->xe_name_offset);
2203 nameval_buf = ocfs2_xa_offset_pointer(loc, nameval_offset);
2205 ocfs2_xa_fill_value_buf(loc, &vb);
2206 rc = __ocfs2_xattr_set_value_outside(loc->xl_inode,
2216 static int ocfs2_xa_set(struct ocfs2_xa_loc *loc,
2221 u32 name_hash = ocfs2_xattr_name_hash(loc->xl_inode, xi->xi_name,
2224 ret = ocfs2_xa_journal_access(ctxt->handle, loc,
2239 ret = ocfs2_xa_remove(loc, ctxt);
2243 ret = ocfs2_xa_prepare_entry(loc, xi, name_hash, ctxt);
2250 ret = ocfs2_xa_store_value(loc, xi, ctxt);
2255 ocfs2_xa_journal_dirty(ctxt->handle, loc);
2261 static void ocfs2_init_dinode_xa_loc(struct ocfs2_xa_loc *loc,
2270 loc->xl_inode = inode;
2271 loc->xl_ops = &ocfs2_xa_block_loc_ops;
2272 loc->xl_storage = bh;
2273 loc->xl_entry = entry;
2274 loc->xl_size = le16_to_cpu(di->i_xattr_inline_size);
2275 loc->xl_header =
2277 loc->xl_size);
2280 static void ocfs2_init_xattr_block_xa_loc(struct ocfs2_xa_loc *loc,
2290 loc->xl_inode = inode;
2291 loc->xl_ops = &ocfs2_xa_block_loc_ops;
2292 loc->xl_storage = bh;
2293 loc->xl_header = &(xb->xb_attrs.xb_header);
2294 loc->xl_entry = entry;
2295 loc->xl_size = bh->b_size - offsetof(struct ocfs2_xattr_block,
2299 static void ocfs2_init_xattr_bucket_xa_loc(struct ocfs2_xa_loc *loc,
2303 loc->xl_inode = bucket->bu_inode;
2304 loc->xl_ops = &ocfs2_xa_bucket_loc_ops;
2305 loc->xl_storage = bucket;
2306 loc->xl_header = bucket_xh(bucket);
2307 loc->xl_entry = entry;
2308 loc->xl_size = OCFS2_XATTR_BUCKET_SIZE;
2770 struct ocfs2_xa_loc loc;
2785 ocfs2_init_dinode_xa_loc(&loc, inode, xs->inode_bh,
2787 ret = ocfs2_xa_set(&loc, xi, ctxt);
2793 xs->here = loc.xl_entry;
2954 struct ocfs2_xa_loc loc;
2974 ocfs2_init_xattr_block_xa_loc(&loc, inode, xs->xattr_bh,
2977 ret = ocfs2_xa_set(&loc, xi, ctxt);
2979 xs->here = loc.xl_entry;
5544 struct ocfs2_xa_loc loc;
5548 ocfs2_init_xattr_bucket_xa_loc(&loc, xs->bucket,
5550 ret = ocfs2_xa_set(&loc, xi, ctxt);
5552 xs->here = loc.xl_entry;
5568 ret = ocfs2_xa_set(&loc, xi, ctxt);
5570 xs->here = loc.xl_entry;