Linux Kernel
3.7.1
Main Page
Related Pages
Modules
Namespaces
Data Structures
Files
File List
Globals
All
Data Structures
Namespaces
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Macros
Groups
Pages
fs
squashfs
xattr_id.c
Go to the documentation of this file.
1
/*
2
* Squashfs - a compressed read only filesystem for Linux
3
*
4
* Copyright (c) 2010
5
* Phillip Lougher <
[email protected]
>
6
*
7
* This program is free software; you can redistribute it and/or
8
* modify it under the terms of the GNU General Public License
9
* as published by the Free Software Foundation; either version 2,
10
* or (at your option) any later version.
11
*
12
* This program is distributed in the hope that it will be useful,
13
* but WITHOUT ANY WARRANTY; without even the implied warranty of
14
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15
* GNU General Public License for more details.
16
*
17
* You should have received a copy of the GNU General Public License
18
* along with this program; if not, write to the Free Software
19
* Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
20
*
21
* xattr_id.c
22
*/
23
24
/*
25
* This file implements code to map the 32-bit xattr id stored in the inode
26
* into the on disk location of the xattr data.
27
*/
28
29
#include <linux/fs.h>
30
#include <
linux/vfs.h
>
31
#include <linux/slab.h>
32
33
#include "
squashfs_fs.h
"
34
#include "
squashfs_fs_sb.h
"
35
#include "
squashfs.h
"
36
#include "
xattr.h
"
37
38
/*
39
* Map xattr id using the xattr id look up table
40
*/
41
int
squashfs_xattr_lookup
(
struct
super_block
*
sb
,
unsigned
int
index
,
42
int
*
count
,
unsigned
int
*
size
,
unsigned
long
long
*
xattr
)
43
{
44
struct
squashfs_sb_info
*msblk = sb->
s_fs_info
;
45
int
block
=
SQUASHFS_XATTR_BLOCK
(index);
46
int
offset
=
SQUASHFS_XATTR_BLOCK_OFFSET
(index);
47
u64
start_block
=
le64_to_cpu
(msblk->
xattr_id_table
[block]);
48
struct
squashfs_xattr_id
id;
49
int
err
;
50
51
err =
squashfs_read_metadata
(sb, &
id
, &start_block, &offset,
52
sizeof
(
id
));
53
if
(err < 0)
54
return
err
;
55
56
*xattr =
le64_to_cpu
(
id
.xattr);
57
*size =
le32_to_cpu
(
id
.size);
58
*count =
le32_to_cpu
(
id
.count);
59
return
0;
60
}
61
62
63
/*
64
* Read uncompressed xattr id lookup table indexes from disk into memory
65
*/
66
__le64
*
squashfs_read_xattr_id_table
(
struct
super_block
*
sb
,
u64
start
,
67
u64
*xattr_table_start,
int
*xattr_ids)
68
{
69
unsigned
int
len
;
70
struct
squashfs_xattr_id_table
*id_table;
71
72
id_table =
squashfs_read_table
(sb, start,
sizeof
(*id_table));
73
if
(IS_ERR(id_table))
74
return
(
__le64
*) id_table;
75
76
*xattr_table_start =
le64_to_cpu
(id_table->
xattr_table_start
);
77
*xattr_ids =
le32_to_cpu
(id_table->
xattr_ids
);
78
kfree
(id_table);
79
80
/* Sanity check values */
81
82
/* there is always at least one xattr id */
83
if
(*xattr_ids == 0)
84
return
ERR_PTR(-
EINVAL
);
85
86
/* xattr_table should be less than start */
87
if
(*xattr_table_start >= start)
88
return
ERR_PTR(-
EINVAL
);
89
90
len =
SQUASHFS_XATTR_BLOCK_BYTES
(*xattr_ids);
91
92
TRACE
(
"In read_xattr_index_table, length %d\n"
, len);
93
94
return
squashfs_read_table
(sb, start +
sizeof
(*id_table), len);
95
}
Generated on Thu Jan 10 2013 14:50:04 for Linux Kernel by
1.8.2