mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-14 15:54:15 +08:00
68252eb5f8
Based on 1 normalized pattern(s): this program is free software you can redistribute it and or modify it under the terms of the gnu general public license as published by the free software foundation either version 2 or at your option any later version this program is distributed in the hope that it will be useful but without any warranty without even the implied warranty of merchantability or fitness for a particular purpose see the gnu general public license for more details you should have received a copy of the gnu general public license along with this program if not write to the free software foundation 51 franklin street fifth floor boston ma 02110 1301 usa extracted by the scancode license scanner the SPDX license identifier GPL-2.0-or-later has been chosen to replace the boilerplate/reference in 23 file(s). Signed-off-by: Thomas Gleixner <tglx@linutronix.de> Reviewed-by: Allison Randal <allison@lohutok.net> Reviewed-by: Kate Stewart <kstewart@linuxfoundation.org> Cc: linux-spdx@vger.kernel.org Link: https://lkml.kernel.org/r/20190520170857.458548087@linutronix.de Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
83 lines
2.0 KiB
C
83 lines
2.0 KiB
C
// SPDX-License-Identifier: GPL-2.0-or-later
|
|
/*
|
|
* Squashfs - a compressed read only filesystem for Linux
|
|
*
|
|
* Copyright (c) 2010
|
|
* Phillip Lougher <phillip@squashfs.org.uk>
|
|
*
|
|
* xattr_id.c
|
|
*/
|
|
|
|
/*
|
|
* This file implements code to map the 32-bit xattr id stored in the inode
|
|
* into the on disk location of the xattr data.
|
|
*/
|
|
|
|
#include <linux/fs.h>
|
|
#include <linux/vfs.h>
|
|
#include <linux/slab.h>
|
|
|
|
#include "squashfs_fs.h"
|
|
#include "squashfs_fs_sb.h"
|
|
#include "squashfs.h"
|
|
#include "xattr.h"
|
|
|
|
/*
|
|
* Map xattr id using the xattr id look up table
|
|
*/
|
|
int squashfs_xattr_lookup(struct super_block *sb, unsigned int index,
|
|
int *count, unsigned int *size, unsigned long long *xattr)
|
|
{
|
|
struct squashfs_sb_info *msblk = sb->s_fs_info;
|
|
int block = SQUASHFS_XATTR_BLOCK(index);
|
|
int offset = SQUASHFS_XATTR_BLOCK_OFFSET(index);
|
|
u64 start_block = le64_to_cpu(msblk->xattr_id_table[block]);
|
|
struct squashfs_xattr_id id;
|
|
int err;
|
|
|
|
err = squashfs_read_metadata(sb, &id, &start_block, &offset,
|
|
sizeof(id));
|
|
if (err < 0)
|
|
return err;
|
|
|
|
*xattr = le64_to_cpu(id.xattr);
|
|
*size = le32_to_cpu(id.size);
|
|
*count = le32_to_cpu(id.count);
|
|
return 0;
|
|
}
|
|
|
|
|
|
/*
|
|
* Read uncompressed xattr id lookup table indexes from disk into memory
|
|
*/
|
|
__le64 *squashfs_read_xattr_id_table(struct super_block *sb, u64 start,
|
|
u64 *xattr_table_start, int *xattr_ids)
|
|
{
|
|
unsigned int len;
|
|
struct squashfs_xattr_id_table *id_table;
|
|
|
|
id_table = squashfs_read_table(sb, start, sizeof(*id_table));
|
|
if (IS_ERR(id_table))
|
|
return (__le64 *) id_table;
|
|
|
|
*xattr_table_start = le64_to_cpu(id_table->xattr_table_start);
|
|
*xattr_ids = le32_to_cpu(id_table->xattr_ids);
|
|
kfree(id_table);
|
|
|
|
/* Sanity check values */
|
|
|
|
/* there is always at least one xattr id */
|
|
if (*xattr_ids == 0)
|
|
return ERR_PTR(-EINVAL);
|
|
|
|
/* xattr_table should be less than start */
|
|
if (*xattr_table_start >= start)
|
|
return ERR_PTR(-EINVAL);
|
|
|
|
len = SQUASHFS_XATTR_BLOCK_BYTES(*xattr_ids);
|
|
|
|
TRACE("In read_xattr_index_table, length %d\n", len);
|
|
|
|
return squashfs_read_table(sb, start + sizeof(*id_table), len);
|
|
}
|