diff options
-rw-r--r-- | fs/exofs/inode.c | 28 |
1 files changed, 9 insertions, 19 deletions
diff --git a/fs/exofs/inode.c b/fs/exofs/inode.c index f5f8ce03c2f..42685424817 100644 --- a/fs/exofs/inode.c +++ b/fs/exofs/inode.c | |||
@@ -1067,8 +1067,10 @@ bad_inode: | |||
1067 | int __exofs_wait_obj_created(struct exofs_i_info *oi) | 1067 | int __exofs_wait_obj_created(struct exofs_i_info *oi) |
1068 | { | 1068 | { |
1069 | if (!obj_created(oi)) { | 1069 | if (!obj_created(oi)) { |
1070 | EXOFS_DBGMSG("!obj_created\n"); | ||
1070 | BUG_ON(!obj_2bcreated(oi)); | 1071 | BUG_ON(!obj_2bcreated(oi)); |
1071 | wait_event(oi->i_wq, obj_created(oi)); | 1072 | wait_event(oi->i_wq, obj_created(oi)); |
1073 | EXOFS_DBGMSG("wait_event done\n"); | ||
1072 | } | 1074 | } |
1073 | return unlikely(is_bad_inode(&oi->vfs_inode)) ? -EIO : 0; | 1075 | return unlikely(is_bad_inode(&oi->vfs_inode)) ? -EIO : 0; |
1074 | } | 1076 | } |
@@ -1102,7 +1104,6 @@ static void create_done(struct exofs_io_state *ios, void *p) | |||
1102 | 1104 | ||
1103 | set_obj_created(oi); | 1105 | set_obj_created(oi); |
1104 | 1106 | ||
1105 | atomic_dec(&inode->i_count); | ||
1106 | wake_up(&oi->i_wq); | 1107 | wake_up(&oi->i_wq); |
1107 | } | 1108 | } |
1108 | 1109 | ||
@@ -1153,17 +1154,11 @@ struct inode *exofs_new_inode(struct inode *dir, int mode) | |||
1153 | ios->obj.id = exofs_oi_objno(oi); | 1154 | ios->obj.id = exofs_oi_objno(oi); |
1154 | exofs_make_credential(oi->i_cred, &ios->obj); | 1155 | exofs_make_credential(oi->i_cred, &ios->obj); |
1155 | 1156 | ||
1156 | /* increment the refcount so that the inode will still be around when we | ||
1157 | * reach the callback | ||
1158 | */ | ||
1159 | atomic_inc(&inode->i_count); | ||
1160 | |||
1161 | ios->done = create_done; | 1157 | ios->done = create_done; |
1162 | ios->private = inode; | 1158 | ios->private = inode; |
1163 | ios->cred = oi->i_cred; | 1159 | ios->cred = oi->i_cred; |
1164 | ret = exofs_sbi_create(ios); | 1160 | ret = exofs_sbi_create(ios); |
1165 | if (ret) { | 1161 | if (ret) { |
1166 | atomic_dec(&inode->i_count); | ||
1167 | exofs_put_io_state(ios); | 1162 | exofs_put_io_state(ios); |
1168 | return ERR_PTR(ret); | 1163 | return ERR_PTR(ret); |
1169 | } | 1164 | } |
@@ -1253,12 +1248,7 @@ static int exofs_update_inode(struct inode *inode, int do_sync) | |||
1253 | ios->out_attr_len = 1; | 1248 | ios->out_attr_len = 1; |
1254 | ios->out_attr = &attr; | 1249 | ios->out_attr = &attr; |
1255 | 1250 | ||
1256 | if (!obj_created(oi)) { | 1251 | wait_obj_created(oi); |
1257 | EXOFS_DBGMSG("!obj_created\n"); | ||
1258 | BUG_ON(!obj_2bcreated(oi)); | ||
1259 | wait_event(oi->i_wq, obj_created(oi)); | ||
1260 | EXOFS_DBGMSG("wait_event done\n"); | ||
1261 | } | ||
1262 | 1252 | ||
1263 | if (!do_sync) { | 1253 | if (!do_sync) { |
1264 | args->sbi = sbi; | 1254 | args->sbi = sbi; |
@@ -1321,12 +1311,12 @@ void exofs_evict_inode(struct inode *inode) | |||
1321 | inode->i_size = 0; | 1311 | inode->i_size = 0; |
1322 | end_writeback(inode); | 1312 | end_writeback(inode); |
1323 | 1313 | ||
1324 | /* if we are deleting an obj that hasn't been created yet, wait */ | 1314 | /* if we are deleting an obj that hasn't been created yet, wait. |
1325 | if (!obj_created(oi)) { | 1315 | * This also makes sure that create_done cannot be called with an |
1326 | BUG_ON(!obj_2bcreated(oi)); | 1316 | * already evicted inode. |
1327 | wait_event(oi->i_wq, obj_created(oi)); | 1317 | */ |
1328 | /* ignore the error attempt a remove anyway */ | 1318 | wait_obj_created(oi); |
1329 | } | 1319 | /* ignore the error, attempt a remove anyway */ |
1330 | 1320 | ||
1331 | /* Now Remove the OSD objects */ | 1321 | /* Now Remove the OSD objects */ |
1332 | ret = exofs_get_io_state(&sbi->layout, &ios); | 1322 | ret = exofs_get_io_state(&sbi->layout, &ios); |