diff options
Diffstat (limited to 'fs/f2fs')
-rw-r--r-- | fs/f2fs/data.c | 11 |
1 files changed, 9 insertions, 2 deletions
diff --git a/fs/f2fs/data.c b/fs/f2fs/data.c index 8a940e518be8..614e444e5297 100644 --- a/fs/f2fs/data.c +++ b/fs/f2fs/data.c | |||
@@ -1126,16 +1126,23 @@ static int __allocate_data_block(struct dnode_of_data *dn) | |||
1126 | 1126 | ||
1127 | if (unlikely(is_inode_flag_set(F2FS_I(dn->inode), FI_NO_ALLOC))) | 1127 | if (unlikely(is_inode_flag_set(F2FS_I(dn->inode), FI_NO_ALLOC))) |
1128 | return -EPERM; | 1128 | return -EPERM; |
1129 | |||
1130 | dn->data_blkaddr = datablock_addr(dn->node_page, dn->ofs_in_node); | ||
1131 | if (dn->data_blkaddr == NEW_ADDR) | ||
1132 | goto alloc; | ||
1133 | |||
1129 | if (unlikely(!inc_valid_block_count(sbi, dn->inode, 1))) | 1134 | if (unlikely(!inc_valid_block_count(sbi, dn->inode, 1))) |
1130 | return -ENOSPC; | 1135 | return -ENOSPC; |
1131 | 1136 | ||
1137 | alloc: | ||
1132 | get_node_info(sbi, dn->nid, &ni); | 1138 | get_node_info(sbi, dn->nid, &ni); |
1133 | set_summary(&sum, dn->nid, dn->ofs_in_node, ni.version); | 1139 | set_summary(&sum, dn->nid, dn->ofs_in_node, ni.version); |
1134 | 1140 | ||
1135 | if (dn->ofs_in_node == 0 && dn->inode_page == dn->node_page) | 1141 | if (dn->ofs_in_node == 0 && dn->inode_page == dn->node_page) |
1136 | seg = CURSEG_DIRECT_IO; | 1142 | seg = CURSEG_DIRECT_IO; |
1137 | 1143 | ||
1138 | allocate_data_block(sbi, NULL, NULL_ADDR, &dn->data_blkaddr, &sum, seg); | 1144 | allocate_data_block(sbi, NULL, dn->data_blkaddr, &dn->data_blkaddr, |
1145 | &sum, seg); | ||
1139 | 1146 | ||
1140 | /* direct IO doesn't use extent cache to maximize the performance */ | 1147 | /* direct IO doesn't use extent cache to maximize the performance */ |
1141 | set_data_blkaddr(dn); | 1148 | set_data_blkaddr(dn); |
@@ -1175,7 +1182,7 @@ static void __allocate_data_blocks(struct inode *inode, loff_t offset, | |||
1175 | block_t blkaddr; | 1182 | block_t blkaddr; |
1176 | 1183 | ||
1177 | blkaddr = datablock_addr(dn.node_page, dn.ofs_in_node); | 1184 | blkaddr = datablock_addr(dn.node_page, dn.ofs_in_node); |
1178 | if (blkaddr == NULL_ADDR) { | 1185 | if (blkaddr == NULL_ADDR || blkaddr == NEW_ADDR) { |
1179 | if (__allocate_data_block(&dn)) | 1186 | if (__allocate_data_block(&dn)) |
1180 | goto sync_out; | 1187 | goto sync_out; |
1181 | allocated = true; | 1188 | allocated = true; |