Commit fe2fd9ed5bf184f797412be8b86f4589d1b77bb8

Authored by Boaz Harrosh
1 parent 571f7f46bf

exofs: Remove inode->i_count manipulation in exofs_new_inode

exofs_new_inode() was incrementing the inode->i_count and
decrementing it in create_done(), in a bad attempt to make sure
the inode will still be there when the asynchronous create_done()
finally arrives. This was very stupid because iput() was not called,
and if it was actually needed, it would leak the inode.

However all this is not needed, because at exofs_evict_inode()
we already wait for create_done() by waiting for the
object_created event. Therefore remove the superfluous ref counting
and just Thicken the comment at exofs_evict_inode() a bit.

While at it change places that open coded wait_obj_created()
to call the already available wrapper.

CC: Dave Chinner <dchinner@redhat.com>
CC: Christoph Hellwig <hch@lst.de>
CC: Nick Piggin <npiggin@kernel.dk>
Signed-off-by: Boaz Harrosh <bharrosh@panasas.com>

Showing 1 changed file with 9 additions and 19 deletions Side-by-side Diff

... ... @@ -1067,8 +1067,10 @@
1067 1067 int __exofs_wait_obj_created(struct exofs_i_info *oi)
1068 1068 {
1069 1069 if (!obj_created(oi)) {
  1070 + EXOFS_DBGMSG("!obj_created\n");
1070 1071 BUG_ON(!obj_2bcreated(oi));
1071 1072 wait_event(oi->i_wq, obj_created(oi));
  1073 + EXOFS_DBGMSG("wait_event done\n");
1072 1074 }
1073 1075 return unlikely(is_bad_inode(&oi->vfs_inode)) ? -EIO : 0;
1074 1076 }
... ... @@ -1102,7 +1104,6 @@
1102 1104  
1103 1105 set_obj_created(oi);
1104 1106  
1105   - atomic_dec(&inode->i_count);
1106 1107 wake_up(&oi->i_wq);
1107 1108 }
1108 1109  
1109 1110  
... ... @@ -1153,17 +1154,11 @@
1153 1154 ios->obj.id = exofs_oi_objno(oi);
1154 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 1157 ios->done = create_done;
1162 1158 ios->private = inode;
1163 1159 ios->cred = oi->i_cred;
1164 1160 ret = exofs_sbi_create(ios);
1165 1161 if (ret) {
1166   - atomic_dec(&inode->i_count);
1167 1162 exofs_put_io_state(ios);
1168 1163 return ERR_PTR(ret);
1169 1164 }
... ... @@ -1253,12 +1248,7 @@
1253 1248 ios->out_attr_len = 1;
1254 1249 ios->out_attr = &attr;
1255 1250  
1256   - if (!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   - }
  1251 + wait_obj_created(oi);
1262 1252  
1263 1253 if (!do_sync) {
1264 1254 args->sbi = sbi;
... ... @@ -1321,12 +1311,12 @@
1321 1311 inode->i_size = 0;
1322 1312 end_writeback(inode);
1323 1313  
1324   - /* if we are deleting an obj that hasn't been created yet, wait */
1325   - if (!obj_created(oi)) {
1326   - BUG_ON(!obj_2bcreated(oi));
1327   - wait_event(oi->i_wq, obj_created(oi));
1328   - /* ignore the error attempt a remove anyway */
1329   - }
  1314 + /* if we are deleting an obj that hasn't been created yet, wait.
  1315 + * This also makes sure that create_done cannot be called with an
  1316 + * already evicted inode.
  1317 + */
  1318 + wait_obj_created(oi);
  1319 + /* ignore the error, attempt a remove anyway */
1330 1320  
1331 1321 /* Now Remove the OSD objects */
1332 1322 ret = exofs_get_io_state(&sbi->layout, &ios);