summaryrefslogtreecommitdiffstats
path: root/fs/f2fs
diff options
context:
space:
mode:
Diffstat (limited to 'fs/f2fs')
-rw-r--r--fs/f2fs/data.c11
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
1137alloc:
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;