Commit 4787d45fa76b97e224a8299086bb5fb496275796

Authored by Al Viro
1 parent cbdbb4c1d2

sysv: i_nlink races in rename()

Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>

Showing 1 changed file with 2 additions and 6 deletions Side-by-side Diff

... ... @@ -245,7 +245,6 @@
245 245 new_de = sysv_find_entry(new_dentry, &new_page);
246 246 if (!new_de)
247 247 goto out_dir;
248   - inode_inc_link_count(old_inode);
249 248 sysv_set_link(new_de, new_page, old_inode);
250 249 new_inode->i_ctime = CURRENT_TIME_SEC;
251 250 if (dir_de)
252 251  
253 252  
254 253  
... ... @@ -257,18 +256,15 @@
257 256 if (new_dir->i_nlink >= SYSV_SB(new_dir->i_sb)->s_link_max)
258 257 goto out_dir;
259 258 }
260   - inode_inc_link_count(old_inode);
261 259 err = sysv_add_link(new_dentry, old_inode);
262   - if (err) {
263   - inode_dec_link_count(old_inode);
  260 + if (err)
264 261 goto out_dir;
265   - }
266 262 if (dir_de)
267 263 inode_inc_link_count(new_dir);
268 264 }
269 265  
270 266 sysv_delete_entry(old_de, old_page);
271   - inode_dec_link_count(old_inode);
  267 + mark_inode_dirty(old_inode);
272 268  
273 269 if (dir_de) {
274 270 sysv_set_link(dir_de, dir_page, new_dir);