projects
/
linux-2.6-block.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
f2fs: enhance on-disk inode structure scalability
[linux-2.6-block.git]
/
fs
/
f2fs
/
inode.c
diff --git
a/fs/f2fs/inode.c
b/fs/f2fs/inode.c
index e42a7a8805dc5e0e7d318802512349007dd76881..0a6699a23dfb5de1e738a823741ffad7938c950a 100644
(file)
--- a/
fs/f2fs/inode.c
+++ b/
fs/f2fs/inode.c
@@
-49,20
+49,22
@@
void f2fs_set_inode_flags(struct inode *inode)
static void __get_inode_rdev(struct inode *inode, struct f2fs_inode *ri)
{
static void __get_inode_rdev(struct inode *inode, struct f2fs_inode *ri)
{
+ int extra_size = get_extra_isize(inode);
+
if (S_ISCHR(inode->i_mode) || S_ISBLK(inode->i_mode) ||
S_ISFIFO(inode->i_mode) || S_ISSOCK(inode->i_mode)) {
if (S_ISCHR(inode->i_mode) || S_ISBLK(inode->i_mode) ||
S_ISFIFO(inode->i_mode) || S_ISSOCK(inode->i_mode)) {
- if (ri->i_addr[
0
])
- inode->i_rdev =
-
old_decode_dev(le32_to_cpu(ri->i_addr[0
]));
+ if (ri->i_addr[
extra_size
])
+ inode->i_rdev =
old_decode_dev(
+
le32_to_cpu(ri->i_addr[extra_size
]));
else
else
- inode->i_rdev =
-
new_decode_dev(le32_to_cpu(ri->i_addr[
1]));
+ inode->i_rdev =
new_decode_dev(
+
le32_to_cpu(ri->i_addr[extra_size +
1]));
}
}
static bool __written_first_block(struct f2fs_inode *ri)
{
}
}
static bool __written_first_block(struct f2fs_inode *ri)
{
- block_t addr = le32_to_cpu(ri->i_addr[
0
]);
+ block_t addr = le32_to_cpu(ri->i_addr[
offset_in_addr(ri)
]);
if (addr != NEW_ADDR && addr != NULL_ADDR)
return true;
if (addr != NEW_ADDR && addr != NULL_ADDR)
return true;
@@
-71,25
+73,27
@@
static bool __written_first_block(struct f2fs_inode *ri)
static void __set_inode_rdev(struct inode *inode, struct f2fs_inode *ri)
{
static void __set_inode_rdev(struct inode *inode, struct f2fs_inode *ri)
{
+ int extra_size = get_extra_isize(inode);
+
if (S_ISCHR(inode->i_mode) || S_ISBLK(inode->i_mode)) {
if (old_valid_dev(inode->i_rdev)) {
if (S_ISCHR(inode->i_mode) || S_ISBLK(inode->i_mode)) {
if (old_valid_dev(inode->i_rdev)) {
- ri->i_addr[
0
] =
+ ri->i_addr[
extra_size
] =
cpu_to_le32(old_encode_dev(inode->i_rdev));
cpu_to_le32(old_encode_dev(inode->i_rdev));
- ri->i_addr[1] = 0;
+ ri->i_addr[
extra_size +
1] = 0;
} else {
} else {
- ri->i_addr[
0
] = 0;
- ri->i_addr[1] =
+ ri->i_addr[
extra_size
] = 0;
+ ri->i_addr[
extra_size +
1] =
cpu_to_le32(new_encode_dev(inode->i_rdev));
cpu_to_le32(new_encode_dev(inode->i_rdev));
- ri->i_addr[2] = 0;
+ ri->i_addr[
extra_size +
2] = 0;
}
}
}
static void __recover_inline_status(struct inode *inode, struct page *ipage)
{
}
}
}
static void __recover_inline_status(struct inode *inode, struct page *ipage)
{
- void *inline_data = inline_data_addr(ipage);
+ void *inline_data = inline_data_addr(i
node, i
page);
__le32 *start = inline_data;
__le32 *start = inline_data;
- __le32 *end = start + MAX_INLINE_DATA / sizeof(__le32);
+ __le32 *end = start + MAX_INLINE_DATA
(inode)
/ sizeof(__le32);
while (start < end) {
if (*start++) {
while (start < end) {
if (*start++) {
@@
-153,6
+157,9
@@
static int do_read_inode(struct inode *inode)
get_inline_info(inode, ri);
get_inline_info(inode, ri);
+ fi->i_extra_isize = f2fs_has_extra_attr(inode) ?
+ le16_to_cpu(ri->i_extra_isize) : 0;
+
/* check data exist */
if (f2fs_has_inline_data(inode) && !f2fs_exist_data(inode))
__recover_inline_status(inode, node_page);
/* check data exist */
if (f2fs_has_inline_data(inode) && !f2fs_exist_data(inode))
__recover_inline_status(inode, node_page);
@@
-292,6
+299,9
@@
int update_inode(struct inode *inode, struct page *node_page)
ri->i_generation = cpu_to_le32(inode->i_generation);
ri->i_dir_level = F2FS_I(inode)->i_dir_level;
ri->i_generation = cpu_to_le32(inode->i_generation);
ri->i_dir_level = F2FS_I(inode)->i_dir_level;
+ if (f2fs_has_extra_attr(inode))
+ ri->i_extra_isize = cpu_to_le16(F2FS_I(inode)->i_extra_isize);
+
__set_inode_rdev(inode, ri);
set_cold_node(inode, node_page);
__set_inode_rdev(inode, ri);
set_cold_node(inode, node_page);
@@
-373,6
+383,8
@@
void f2fs_evict_inode(struct inode *inode)
if (inode->i_nlink || is_bad_inode(inode))
goto no_delete;
if (inode->i_nlink || is_bad_inode(inode))
goto no_delete;
+ dquot_initialize(inode);
+
remove_ino_entry(sbi, inode->i_ino, APPEND_INO);
remove_ino_entry(sbi, inode->i_ino, UPDATE_INO);
remove_ino_entry(sbi, inode->i_ino, APPEND_INO);
remove_ino_entry(sbi, inode->i_ino, UPDATE_INO);
@@
-405,8
+417,11
@@
retry:
if (err)
update_inode_page(inode);
if (err)
update_inode_page(inode);
+ dquot_free_inode(inode);
sb_end_intwrite(inode->i_sb);
no_delete:
sb_end_intwrite(inode->i_sb);
no_delete:
+ dquot_drop(inode);
+
stat_dec_inline_xattr(inode);
stat_dec_inline_dir(inode);
stat_dec_inline_inode(inode);
stat_dec_inline_xattr(inode);
stat_dec_inline_dir(inode);
stat_dec_inline_inode(inode);