Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openanolis
cloud-kernel
提交
12260140
cloud-kernel
项目概览
openanolis
/
cloud-kernel
大约 1 年 前同步成功
通知
158
Star
36
Fork
7
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
10
列表
看板
标记
里程碑
合并请求
2
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
cloud-kernel
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
10
Issue
10
列表
看板
标记
里程碑
合并请求
2
合并请求
2
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
提交
12260140
编写于
1月 05, 2009
作者:
P
Phillip Lougher
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Squashfs: export operations
Signed-off-by:
N
Phillip Lougher
<
phillip@lougher.demon.co.uk
>
上级
0aa66619
变更
1
显示空白变更内容
内联
并排
Showing
1 changed file
with
155 addition
and
0 deletion
+155
-0
fs/squashfs/export.c
fs/squashfs/export.c
+155
-0
未找到文件。
fs/squashfs/export.c
0 → 100644
浏览文件 @
12260140
/*
* Squashfs - a compressed read only filesystem for Linux
*
* Copyright (c) 2002, 2003, 2004, 2005, 2006, 2007, 2008
* Phillip Lougher <phillip@lougher.demon.co.uk>
*
* 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.
*
* export.c
*/
/*
* This file implements code to make Squashfs filesystems exportable (NFS etc.)
*
* The export code uses an inode lookup table to map inode numbers passed in
* filehandles to an inode location on disk. This table is stored compressed
* into metadata blocks. A second index table is used to locate these. This
* second index table for speed of access (and because it is small) is read at
* mount time and cached in memory.
*
* The inode lookup table is used only by the export code, inode disk
* locations are directly encoded in directories, enabling direct access
* without an intermediate lookup for all operations except the export ops.
*/
#include <linux/fs.h>
#include <linux/vfs.h>
#include <linux/dcache.h>
#include <linux/exportfs.h>
#include <linux/zlib.h>
#include "squashfs_fs.h"
#include "squashfs_fs_sb.h"
#include "squashfs_fs_i.h"
#include "squashfs.h"
/*
* Look-up inode number (ino) in table, returning the inode location.
*/
static
long
long
squashfs_inode_lookup
(
struct
super_block
*
sb
,
int
ino_num
)
{
struct
squashfs_sb_info
*
msblk
=
sb
->
s_fs_info
;
int
blk
=
SQUASHFS_LOOKUP_BLOCK
(
ino_num
-
1
);
int
offset
=
SQUASHFS_LOOKUP_BLOCK_OFFSET
(
ino_num
-
1
);
u64
start
=
le64_to_cpu
(
msblk
->
inode_lookup_table
[
blk
]);
__le64
ino
;
int
err
;
TRACE
(
"Entered squashfs_inode_lookup, inode_number = %d
\n
"
,
ino_num
);
err
=
squashfs_read_metadata
(
sb
,
&
ino
,
&
start
,
&
offset
,
sizeof
(
ino
));
if
(
err
<
0
)
return
err
;
TRACE
(
"squashfs_inode_lookup, inode = 0x%llx
\n
"
,
(
u64
)
le64_to_cpu
(
ino
));
return
le64_to_cpu
(
ino
);
}
static
struct
dentry
*
squashfs_export_iget
(
struct
super_block
*
sb
,
unsigned
int
ino_num
)
{
long
long
ino
;
struct
dentry
*
dentry
=
ERR_PTR
(
-
ENOENT
);
TRACE
(
"Entered squashfs_export_iget
\n
"
);
ino
=
squashfs_inode_lookup
(
sb
,
ino_num
);
if
(
ino
>=
0
)
dentry
=
d_obtain_alias
(
squashfs_iget
(
sb
,
ino
,
ino_num
));
return
dentry
;
}
static
struct
dentry
*
squashfs_fh_to_dentry
(
struct
super_block
*
sb
,
struct
fid
*
fid
,
int
fh_len
,
int
fh_type
)
{
if
((
fh_type
!=
FILEID_INO32_GEN
&&
fh_type
!=
FILEID_INO32_GEN_PARENT
)
||
fh_len
<
2
)
return
NULL
;
return
squashfs_export_iget
(
sb
,
fid
->
i32
.
ino
);
}
static
struct
dentry
*
squashfs_fh_to_parent
(
struct
super_block
*
sb
,
struct
fid
*
fid
,
int
fh_len
,
int
fh_type
)
{
if
(
fh_type
!=
FILEID_INO32_GEN_PARENT
||
fh_len
<
4
)
return
NULL
;
return
squashfs_export_iget
(
sb
,
fid
->
i32
.
parent_ino
);
}
static
struct
dentry
*
squashfs_get_parent
(
struct
dentry
*
child
)
{
struct
inode
*
inode
=
child
->
d_inode
;
unsigned
int
parent_ino
=
squashfs_i
(
inode
)
->
parent
;
return
squashfs_export_iget
(
inode
->
i_sb
,
parent_ino
);
}
/*
* Read uncompressed inode lookup table indexes off disk into memory
*/
__le64
*
squashfs_read_inode_lookup_table
(
struct
super_block
*
sb
,
u64
lookup_table_start
,
unsigned
int
inodes
)
{
unsigned
int
length
=
SQUASHFS_LOOKUP_BLOCK_BYTES
(
inodes
);
__le64
*
inode_lookup_table
;
int
err
;
TRACE
(
"In read_inode_lookup_table, length %d
\n
"
,
length
);
/* Allocate inode lookup table indexes */
inode_lookup_table
=
kmalloc
(
length
,
GFP_KERNEL
);
if
(
inode_lookup_table
==
NULL
)
{
ERROR
(
"Failed to allocate inode lookup table
\n
"
);
return
ERR_PTR
(
-
ENOMEM
);
}
err
=
squashfs_read_table
(
sb
,
inode_lookup_table
,
lookup_table_start
,
length
);
if
(
err
<
0
)
{
ERROR
(
"unable to read inode lookup table
\n
"
);
kfree
(
inode_lookup_table
);
return
ERR_PTR
(
err
);
}
return
inode_lookup_table
;
}
const
struct
export_operations
squashfs_export_ops
=
{
.
fh_to_dentry
=
squashfs_fh_to_dentry
,
.
fh_to_parent
=
squashfs_fh_to_parent
,
.
get_parent
=
squashfs_get_parent
};
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录