1 // SPDX-License-Identifier: GPL-2.0 2 /* 3 * linux/fs/nfs/unlink.c 4 * 5 * nfs sillydelete handling 6 * 7 */ 8 9 #include <linux/slab.h> 10 #include <linux/string.h> 11 #include <linux/dcache.h> 12 #include <linux/sunrpc/sched.h> 13 #include <linux/sunrpc/clnt.h> 14 #include <linux/nfs_fs.h> 15 #include <linux/sched.h> 16 #include <linux/wait.h> 17 #include <linux/namei.h> 18 #include <linux/fsnotify.h> 19 20 #include "internal.h" 21 #include "nfs4_fs.h" 22 #include "iostat.h" 23 #include "delegation.h" 24 25 #include "nfstrace.h" 26 27 /** 28 * nfs_free_unlinkdata - release data from a sillydelete operation. 29 * @data: pointer to unlink structure. 30 */ 31 static void 32 nfs_free_unlinkdata(struct nfs_unlinkdata *data) 33 { 34 put_cred(data->cred); 35 kfree(data->args.name.name); 36 kfree(data); 37 } 38 39 /** 40 * nfs_async_unlink_done - Sillydelete post-processing 41 * @task: rpc_task of the sillydelete 42 * 43 * Do the directory attribute update. 44 */ 45 static void nfs_async_unlink_done(struct rpc_task *task, void *calldata) 46 { 47 struct nfs_unlinkdata *data = calldata; 48 struct inode *dir = d_inode(data->dentry->d_parent); 49 50 trace_nfs_sillyrename_unlink(data, task->tk_status); 51 if (!NFS_PROTO(dir)->unlink_done(task, dir)) 52 rpc_restart_call_prepare(task); 53 } 54 55 /** 56 * nfs_async_unlink_release - Release the sillydelete data. 57 * @task: rpc_task of the sillydelete 58 * 59 * We need to call nfs_put_unlinkdata as a 'tk_release' task since the 60 * rpc_task would be freed too. 61 */ 62 static void nfs_async_unlink_release(void *calldata) 63 { 64 struct nfs_unlinkdata *data = calldata; 65 struct dentry *dentry = data->dentry; 66 struct super_block *sb = dentry->d_sb; 67 68 up_read_non_owner(&NFS_I(d_inode(dentry->d_parent))->rmdir_sem); 69 d_lookup_done(dentry); 70 nfs_free_unlinkdata(data); 71 dput(dentry); 72 nfs_sb_deactive(sb); 73 } 74 75 static void nfs_unlink_prepare(struct rpc_task *task, void *calldata) 76 { 77 struct nfs_unlinkdata *data = calldata; 78 struct inode *dir = d_inode(data->dentry->d_parent); 79 NFS_PROTO(dir)->unlink_rpc_prepare(task, data); 80 } 81 82 static const struct rpc_call_ops nfs_unlink_ops = { 83 .rpc_call_done = nfs_async_unlink_done, 84 .rpc_release = nfs_async_unlink_release, 85 .rpc_call_prepare = nfs_unlink_prepare, 86 }; 87 88 static void nfs_do_call_unlink(struct inode *inode, struct nfs_unlinkdata *data) 89 { 90 struct rpc_message msg = { 91 .rpc_argp = &data->args, 92 .rpc_resp = &data->res, 93 .rpc_cred = data->cred, 94 }; 95 struct rpc_task_setup task_setup_data = { 96 .rpc_message = &msg, 97 .callback_ops = &nfs_unlink_ops, 98 .callback_data = data, 99 .workqueue = nfsiod_workqueue, 100 .flags = RPC_TASK_ASYNC, 101 }; 102 struct rpc_task *task; 103 struct inode *dir = d_inode(data->dentry->d_parent); 104 nfs_sb_active(dir->i_sb); 105 data->args.fh = NFS_FH(dir); 106 nfs_fattr_init(data->res.dir_attr); 107 108 NFS_PROTO(dir)->unlink_setup(&msg, data->dentry, inode); 109 110 task_setup_data.rpc_client = NFS_CLIENT(dir); 111 task = rpc_run_task(&task_setup_data); 112 if (!IS_ERR(task)) 113 rpc_put_task_async(task); 114 } 115 116 static int nfs_call_unlink(struct dentry *dentry, struct inode *inode, struct nfs_unlinkdata *data) 117 { 118 struct inode *dir = d_inode(dentry->d_parent); 119 struct dentry *alias; 120 121 down_read_non_owner(&NFS_I(dir)->rmdir_sem); 122 alias = d_alloc_parallel(dentry->d_parent, &data->args.name, &data->wq); 123 if (IS_ERR(alias)) { 124 up_read_non_owner(&NFS_I(dir)->rmdir_sem); 125 return 0; 126 } 127 if (!d_in_lookup(alias)) { 128 int ret; 129 void *devname_garbage = NULL; 130 131 /* 132 * Hey, we raced with lookup... See if we need to transfer 133 * the sillyrename information to the aliased dentry. 134 */ 135 spin_lock(&alias->d_lock); 136 if (d_really_is_positive(alias) && 137 !(alias->d_flags & DCACHE_NFSFS_RENAMED)) { 138 devname_garbage = alias->d_fsdata; 139 alias->d_fsdata = data; 140 alias->d_flags |= DCACHE_NFSFS_RENAMED; 141 ret = 1; 142 } else 143 ret = 0; 144 spin_unlock(&alias->d_lock); 145 dput(alias); 146 up_read_non_owner(&NFS_I(dir)->rmdir_sem); 147 /* 148 * If we'd displaced old cached devname, free it. At that 149 * point dentry is definitely not a root, so we won't need 150 * that anymore. 151 */ 152 kfree(devname_garbage); 153 return ret; 154 } 155 data->dentry = alias; 156 nfs_do_call_unlink(inode, data); 157 return 1; 158 } 159 160 /** 161 * nfs_async_unlink - asynchronous unlinking of a file 162 * @dir: parent directory of dentry 163 * @dentry: dentry to unlink 164 */ 165 static int 166 nfs_async_unlink(struct dentry *dentry, const struct qstr *name) 167 { 168 struct nfs_unlinkdata *data; 169 int status = -ENOMEM; 170 void *devname_garbage = NULL; 171 172 data = kzalloc(sizeof(*data), GFP_KERNEL); 173 if (data == NULL) 174 goto out; 175 data->args.name.name = kstrdup(name->name, GFP_KERNEL); 176 if (!data->args.name.name) 177 goto out_free; 178 data->args.name.len = name->len; 179 180 data->cred = get_current_cred(); 181 data->res.dir_attr = &data->dir_attr; 182 init_waitqueue_head(&data->wq); 183 184 status = -EBUSY; 185 spin_lock(&dentry->d_lock); 186 if (dentry->d_flags & DCACHE_NFSFS_RENAMED) 187 goto out_unlock; 188 dentry->d_flags |= DCACHE_NFSFS_RENAMED; 189 devname_garbage = dentry->d_fsdata; 190 dentry->d_fsdata = data; 191 spin_unlock(&dentry->d_lock); 192 /* 193 * If we'd displaced old cached devname, free it. At that 194 * point dentry is definitely not a root, so we won't need 195 * that anymore. 196 */ 197 kfree(devname_garbage); 198 return 0; 199 out_unlock: 200 spin_unlock(&dentry->d_lock); 201 put_cred(data->cred); 202 kfree(data->args.name.name); 203 out_free: 204 kfree(data); 205 out: 206 return status; 207 } 208 209 /** 210 * nfs_complete_unlink - Initialize completion of the sillydelete 211 * @dentry: dentry to delete 212 * @inode: inode 213 * 214 * Since we're most likely to be called by dentry_iput(), we 215 * only use the dentry to find the sillydelete. We then copy the name 216 * into the qstr. 217 */ 218 void 219 nfs_complete_unlink(struct dentry *dentry, struct inode *inode) 220 { 221 struct nfs_unlinkdata *data; 222 223 spin_lock(&dentry->d_lock); 224 dentry->d_flags &= ~DCACHE_NFSFS_RENAMED; 225 data = dentry->d_fsdata; 226 dentry->d_fsdata = NULL; 227 spin_unlock(&dentry->d_lock); 228 229 if (NFS_STALE(inode) || !nfs_call_unlink(dentry, inode, data)) 230 nfs_free_unlinkdata(data); 231 } 232 233 /* Cancel a queued async unlink. Called when a sillyrename run fails. */ 234 static void 235 nfs_cancel_async_unlink(struct dentry *dentry) 236 { 237 spin_lock(&dentry->d_lock); 238 if (dentry->d_flags & DCACHE_NFSFS_RENAMED) { 239 struct nfs_unlinkdata *data = dentry->d_fsdata; 240 241 dentry->d_flags &= ~DCACHE_NFSFS_RENAMED; 242 dentry->d_fsdata = NULL; 243 spin_unlock(&dentry->d_lock); 244 nfs_free_unlinkdata(data); 245 return; 246 } 247 spin_unlock(&dentry->d_lock); 248 } 249 250 /** 251 * nfs_async_rename_done - Sillyrename post-processing 252 * @task: rpc_task of the sillyrename 253 * @calldata: nfs_renamedata for the sillyrename 254 * 255 * Do the directory attribute updates and the d_move 256 */ 257 static void nfs_async_rename_done(struct rpc_task *task, void *calldata) 258 { 259 struct nfs_renamedata *data = calldata; 260 struct inode *old_dir = data->old_dir; 261 struct inode *new_dir = data->new_dir; 262 struct dentry *old_dentry = data->old_dentry; 263 264 trace_nfs_sillyrename_rename(old_dir, old_dentry, 265 new_dir, data->new_dentry, task->tk_status); 266 if (!NFS_PROTO(old_dir)->rename_done(task, old_dir, new_dir)) { 267 rpc_restart_call_prepare(task); 268 return; 269 } 270 271 if (data->complete) 272 data->complete(task, data); 273 } 274 275 /** 276 * nfs_async_rename_release - Release the sillyrename data. 277 * @calldata: the struct nfs_renamedata to be released 278 */ 279 static void nfs_async_rename_release(void *calldata) 280 { 281 struct nfs_renamedata *data = calldata; 282 struct super_block *sb = data->old_dir->i_sb; 283 284 if (d_really_is_positive(data->old_dentry)) 285 nfs_mark_for_revalidate(d_inode(data->old_dentry)); 286 287 /* The result of the rename is unknown. Play it safe by 288 * forcing a new lookup */ 289 if (data->cancelled) { 290 spin_lock(&data->old_dir->i_lock); 291 nfs_force_lookup_revalidate(data->old_dir); 292 spin_unlock(&data->old_dir->i_lock); 293 if (data->new_dir != data->old_dir) { 294 spin_lock(&data->new_dir->i_lock); 295 nfs_force_lookup_revalidate(data->new_dir); 296 spin_unlock(&data->new_dir->i_lock); 297 } 298 } 299 300 dput(data->old_dentry); 301 dput(data->new_dentry); 302 iput(data->old_dir); 303 iput(data->new_dir); 304 nfs_sb_deactive(sb); 305 put_cred(data->cred); 306 kfree(data); 307 } 308 309 static void nfs_rename_prepare(struct rpc_task *task, void *calldata) 310 { 311 struct nfs_renamedata *data = calldata; 312 NFS_PROTO(data->old_dir)->rename_rpc_prepare(task, data); 313 } 314 315 static const struct rpc_call_ops nfs_rename_ops = { 316 .rpc_call_done = nfs_async_rename_done, 317 .rpc_release = nfs_async_rename_release, 318 .rpc_call_prepare = nfs_rename_prepare, 319 }; 320 321 /** 322 * nfs_async_rename - perform an asynchronous rename operation 323 * @old_dir: directory that currently holds the dentry to be renamed 324 * @new_dir: target directory for the rename 325 * @old_dentry: original dentry to be renamed 326 * @new_dentry: dentry to which the old_dentry should be renamed 327 * 328 * It's expected that valid references to the dentries and inodes are held 329 */ 330 struct rpc_task * 331 nfs_async_rename(struct inode *old_dir, struct inode *new_dir, 332 struct dentry *old_dentry, struct dentry *new_dentry, 333 void (*complete)(struct rpc_task *, struct nfs_renamedata *)) 334 { 335 struct nfs_renamedata *data; 336 struct rpc_message msg = { }; 337 struct rpc_task_setup task_setup_data = { 338 .rpc_message = &msg, 339 .callback_ops = &nfs_rename_ops, 340 .workqueue = nfsiod_workqueue, 341 .rpc_client = NFS_CLIENT(old_dir), 342 .flags = RPC_TASK_ASYNC, 343 }; 344 345 data = kzalloc(sizeof(*data), GFP_KERNEL); 346 if (data == NULL) 347 return ERR_PTR(-ENOMEM); 348 task_setup_data.callback_data = data; 349 350 data->cred = get_current_cred(); 351 352 msg.rpc_argp = &data->args; 353 msg.rpc_resp = &data->res; 354 msg.rpc_cred = data->cred; 355 356 /* set up nfs_renamedata */ 357 data->old_dir = old_dir; 358 ihold(old_dir); 359 data->new_dir = new_dir; 360 ihold(new_dir); 361 data->old_dentry = dget(old_dentry); 362 data->new_dentry = dget(new_dentry); 363 nfs_fattr_init(&data->old_fattr); 364 nfs_fattr_init(&data->new_fattr); 365 data->complete = complete; 366 367 /* set up nfs_renameargs */ 368 data->args.old_dir = NFS_FH(old_dir); 369 data->args.old_name = &old_dentry->d_name; 370 data->args.new_dir = NFS_FH(new_dir); 371 data->args.new_name = &new_dentry->d_name; 372 373 /* set up nfs_renameres */ 374 data->res.old_fattr = &data->old_fattr; 375 data->res.new_fattr = &data->new_fattr; 376 377 nfs_sb_active(old_dir->i_sb); 378 379 NFS_PROTO(data->old_dir)->rename_setup(&msg, old_dentry, new_dentry); 380 381 return rpc_run_task(&task_setup_data); 382 } 383 384 /* 385 * Perform tasks needed when a sillyrename is done such as cancelling the 386 * queued async unlink if it failed. 387 */ 388 static void 389 nfs_complete_sillyrename(struct rpc_task *task, struct nfs_renamedata *data) 390 { 391 struct dentry *dentry = data->old_dentry; 392 393 if (task->tk_status != 0) { 394 nfs_cancel_async_unlink(dentry); 395 return; 396 } 397 398 /* 399 * vfs_unlink and the like do not issue this when a file is 400 * sillyrenamed, so do it here. 401 */ 402 fsnotify_nameremove(dentry, 0); 403 } 404 405 #define SILLYNAME_PREFIX ".nfs" 406 #define SILLYNAME_PREFIX_LEN ((unsigned)sizeof(SILLYNAME_PREFIX) - 1) 407 #define SILLYNAME_FILEID_LEN ((unsigned)sizeof(u64) << 1) 408 #define SILLYNAME_COUNTER_LEN ((unsigned)sizeof(unsigned int) << 1) 409 #define SILLYNAME_LEN (SILLYNAME_PREFIX_LEN + \ 410 SILLYNAME_FILEID_LEN + \ 411 SILLYNAME_COUNTER_LEN) 412 413 /** 414 * nfs_sillyrename - Perform a silly-rename of a dentry 415 * @dir: inode of directory that contains dentry 416 * @dentry: dentry to be sillyrenamed 417 * 418 * NFSv2/3 is stateless and the server doesn't know when the client is 419 * holding a file open. To prevent application problems when a file is 420 * unlinked while it's still open, the client performs a "silly-rename". 421 * That is, it renames the file to a hidden file in the same directory, 422 * and only performs the unlink once the last reference to it is put. 423 * 424 * The final cleanup is done during dentry_iput. 425 * 426 * (Note: NFSv4 is stateful, and has opens, so in theory an NFSv4 server 427 * could take responsibility for keeping open files referenced. The server 428 * would also need to ensure that opened-but-deleted files were kept over 429 * reboots. However, we may not assume a server does so. (RFC 5661 430 * does provide an OPEN4_RESULT_PRESERVE_UNLINKED flag that a server can 431 * use to advertise that it does this; some day we may take advantage of 432 * it.)) 433 */ 434 int 435 nfs_sillyrename(struct inode *dir, struct dentry *dentry) 436 { 437 static unsigned int sillycounter; 438 unsigned char silly[SILLYNAME_LEN + 1]; 439 unsigned long long fileid; 440 struct dentry *sdentry; 441 struct inode *inode = d_inode(dentry); 442 struct rpc_task *task; 443 int error = -EBUSY; 444 445 dfprintk(VFS, "NFS: silly-rename(%pd2, ct=%d)\n", 446 dentry, d_count(dentry)); 447 nfs_inc_stats(dir, NFSIOS_SILLYRENAME); 448 449 /* 450 * We don't allow a dentry to be silly-renamed twice. 451 */ 452 if (dentry->d_flags & DCACHE_NFSFS_RENAMED) 453 goto out; 454 455 fileid = NFS_FILEID(d_inode(dentry)); 456 457 sdentry = NULL; 458 do { 459 int slen; 460 dput(sdentry); 461 sillycounter++; 462 slen = scnprintf(silly, sizeof(silly), 463 SILLYNAME_PREFIX "%0*llx%0*x", 464 SILLYNAME_FILEID_LEN, fileid, 465 SILLYNAME_COUNTER_LEN, sillycounter); 466 467 dfprintk(VFS, "NFS: trying to rename %pd to %s\n", 468 dentry, silly); 469 470 sdentry = lookup_one_len(silly, dentry->d_parent, slen); 471 /* 472 * N.B. Better to return EBUSY here ... it could be 473 * dangerous to delete the file while it's in use. 474 */ 475 if (IS_ERR(sdentry)) 476 goto out; 477 } while (d_inode(sdentry) != NULL); /* need negative lookup */ 478 479 ihold(inode); 480 481 /* queue unlink first. Can't do this from rpc_release as it 482 * has to allocate memory 483 */ 484 error = nfs_async_unlink(dentry, &sdentry->d_name); 485 if (error) 486 goto out_dput; 487 488 /* run the rename task, undo unlink if it fails */ 489 task = nfs_async_rename(dir, dir, dentry, sdentry, 490 nfs_complete_sillyrename); 491 if (IS_ERR(task)) { 492 error = -EBUSY; 493 nfs_cancel_async_unlink(dentry); 494 goto out_dput; 495 } 496 497 /* wait for the RPC task to complete, unless a SIGKILL intervenes */ 498 error = rpc_wait_for_completion_task(task); 499 if (error == 0) 500 error = task->tk_status; 501 switch (error) { 502 case 0: 503 /* The rename succeeded */ 504 nfs_set_verifier(dentry, nfs_save_change_attribute(dir)); 505 spin_lock(&inode->i_lock); 506 NFS_I(inode)->attr_gencount = nfs_inc_attr_generation_counter(); 507 NFS_I(inode)->cache_validity |= NFS_INO_INVALID_CHANGE 508 | NFS_INO_INVALID_CTIME 509 | NFS_INO_REVAL_FORCED; 510 spin_unlock(&inode->i_lock); 511 d_move(dentry, sdentry); 512 break; 513 case -ERESTARTSYS: 514 /* The result of the rename is unknown. Play it safe by 515 * forcing a new lookup */ 516 d_drop(dentry); 517 d_drop(sdentry); 518 } 519 rpc_put_task(task); 520 out_dput: 521 iput(inode); 522 dput(sdentry); 523 out: 524 return error; 525 } 526