Commit 4787d45fa76b97e224a8299086bb5fb496275796
1 parent
cbdbb4c1d2
Exists in
master
and in
39 other branches
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
fs/sysv/namei.c
... | ... | @@ -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); |