Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit ca433f07 authored by Chao Yu's avatar Chao Yu Committed by Jaegeuk Kim
Browse files

f2fs: introduce read_xattr_block



Commit ba38c27eb93e ("f2fs: enhance lookup xattr") introduces
lookup_all_xattrs duplicating from read_all_xattrs, which leaves
lots of similar codes in between them, so introduce new help
read_xattr_block to clean up redundant codes.

Signed-off-by: default avatarChao Yu <yuchao0@huawei.com>
Signed-off-by: default avatarJaegeuk Kim <jaegeuk@kernel.org>
parent e002c811
Loading
Loading
Loading
Loading
+24 −26
Original line number Diff line number Diff line
@@ -313,12 +313,31 @@ static int read_inline_xattr(struct inode *inode, struct page *ipage,
	return 0;
}

static int read_xattr_block(struct inode *inode, void *txattr_addr)
{
	struct f2fs_sb_info *sbi = F2FS_I_SB(inode);
	nid_t xnid = F2FS_I(inode)->i_xattr_nid;
	unsigned int inline_size = inline_xattr_size(inode);
	struct page *xpage;
	void *xattr_addr;

	/* The inode already has an extended attribute block. */
	xpage = get_node_page(sbi, xnid);
	if (IS_ERR(xpage))
		return PTR_ERR(xpage);

	xattr_addr = page_address(xpage);
	memcpy(txattr_addr + inline_size, xattr_addr, VALID_XATTR_BLOCK_SIZE);
	f2fs_put_page(xpage, 1);

	return 0;
}

static int lookup_all_xattrs(struct inode *inode, struct page *ipage,
				unsigned int index, unsigned int len,
				const char *name, struct f2fs_xattr_entry **xe,
				void **base_addr)
{
	struct f2fs_sb_info *sbi = F2FS_I_SB(inode);
	void *cur_addr, *txattr_addr, *last_addr = NULL;
	nid_t xnid = F2FS_I(inode)->i_xattr_nid;
	unsigned int size = xnid ? VALID_XATTR_BLOCK_SIZE : 0;
@@ -347,21 +366,11 @@ static int lookup_all_xattrs(struct inode *inode, struct page *ipage,

	/* read from xattr node block */
	if (xnid) {
		struct page *xpage;
		void *xattr_addr;

		/* The inode already has an extended attribute block. */
		xpage = get_node_page(sbi, xnid);
		if (IS_ERR(xpage)) {
			err = PTR_ERR(xpage);
		err = read_xattr_block(inode, txattr_addr);
		if (err)
			goto out;
	}

		xattr_addr = page_address(xpage);
		memcpy(txattr_addr + inline_size, xattr_addr, size);
		f2fs_put_page(xpage, 1);
	}

	if (last_addr)
		cur_addr = XATTR_HDR(last_addr) - 1;
	else
@@ -384,7 +393,6 @@ out:
static int read_all_xattrs(struct inode *inode, struct page *ipage,
							void **base_addr)
{
	struct f2fs_sb_info *sbi = F2FS_I_SB(inode);
	struct f2fs_xattr_header *header;
	nid_t xnid = F2FS_I(inode)->i_xattr_nid;
	unsigned int size = VALID_XATTR_BLOCK_SIZE;
@@ -406,21 +414,11 @@ static int read_all_xattrs(struct inode *inode, struct page *ipage,

	/* read from xattr node block */
	if (xnid) {
		struct page *xpage;
		void *xattr_addr;

		/* The inode already has an extended attribute block. */
		xpage = get_node_page(sbi, xnid);
		if (IS_ERR(xpage)) {
			err = PTR_ERR(xpage);
		err = read_xattr_block(inode, txattr_addr);
		if (err)
			goto fail;
	}

		xattr_addr = page_address(xpage);
		memcpy(txattr_addr + inline_size, xattr_addr, size);
		f2fs_put_page(xpage, 1);
	}

	header = XATTR_HDR(txattr_addr);

	/* never been allocated xattrs */