usb: gadget: udc: reduce indentation
[linux-2.6-block.git] / fs / nfs / unlink.c
CommitLineData
b2441318 1// SPDX-License-Identifier: GPL-2.0
1da177e4
LT
2/*
3 * linux/fs/nfs/unlink.c
4 *
5 * nfs sillydelete handling
6 *
1da177e4
LT
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>
b35e7041
LT
15#include <linux/sched.h>
16#include <linux/wait.h>
779c5179 17#include <linux/namei.h>
f7be7284 18#include <linux/fsnotify.h>
1da177e4 19
ef818a28 20#include "internal.h"
472cfbd9 21#include "nfs4_fs.h"
779c5179
JL
22#include "iostat.h"
23#include "delegation.h"
ef818a28 24
70ded201
TM
25#include "nfstrace.h"
26
1da177e4 27/**
e4eff1a6 28 * nfs_free_unlinkdata - release data from a sillydelete operation.
1da177e4
LT
29 * @data: pointer to unlink structure.
30 */
31static void
e4eff1a6 32nfs_free_unlinkdata(struct nfs_unlinkdata *data)
1da177e4 33{
a52458b4 34 put_cred(data->cred);
e4eff1a6
TM
35 kfree(data->args.name.name);
36 kfree(data);
1da177e4
LT
37}
38
1da177e4
LT
39/**
40 * nfs_async_unlink_done - Sillydelete post-processing
41 * @task: rpc_task of the sillydelete
42 *
43 * Do the directory attribute update.
44 */
963d8fe5 45static void nfs_async_unlink_done(struct rpc_task *task, void *calldata)
1da177e4 46{
e4eff1a6 47 struct nfs_unlinkdata *data = calldata;
884be175 48 struct inode *dir = d_inode(data->dentry->d_parent);
e4eff1a6 49
70ded201 50 trace_nfs_sillyrename_unlink(data, task->tk_status);
e4eff1a6 51 if (!NFS_PROTO(dir)->unlink_done(task, dir))
d00c5d43 52 rpc_restart_call_prepare(task);
1da177e4
LT
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 */
963d8fe5 62static void nfs_async_unlink_release(void *calldata)
1da177e4 63{
963d8fe5 64 struct nfs_unlinkdata *data = calldata;
884be175
AV
65 struct dentry *dentry = data->dentry;
66 struct super_block *sb = dentry->d_sb;
565277f6 67
884be175
AV
68 up_read_non_owner(&NFS_I(d_inode(dentry->d_parent))->rmdir_sem);
69 d_lookup_done(dentry);
e4eff1a6 70 nfs_free_unlinkdata(data);
884be175 71 dput(dentry);
322b2b90 72 nfs_sb_deactive(sb);
1da177e4
LT
73}
74
17280175 75static void nfs_unlink_prepare(struct rpc_task *task, void *calldata)
472cfbd9
AA
76{
77 struct nfs_unlinkdata *data = calldata;
884be175
AV
78 struct inode *dir = d_inode(data->dentry->d_parent);
79 NFS_PROTO(dir)->unlink_rpc_prepare(task, data);
472cfbd9 80}
472cfbd9 81
963d8fe5
TM
82static const struct rpc_call_ops nfs_unlink_ops = {
83 .rpc_call_done = nfs_async_unlink_done,
84 .rpc_release = nfs_async_unlink_release,
472cfbd9 85 .rpc_call_prepare = nfs_unlink_prepare,
963d8fe5
TM
86};
87
ed7e9ad0 88static void nfs_do_call_unlink(struct inode *inode, struct nfs_unlinkdata *data)
e4eff1a6 89{
5138fde0
TM
90 struct rpc_message msg = {
91 .rpc_argp = &data->args,
92 .rpc_resp = &data->res,
93 .rpc_cred = data->cred,
94 };
c970aa85 95 struct rpc_task_setup task_setup_data = {
5138fde0 96 .rpc_message = &msg,
c970aa85
TM
97 .callback_ops = &nfs_unlink_ops,
98 .callback_data = data,
1daef0a8 99 .workqueue = nfsiod_workqueue,
c970aa85
TM
100 .flags = RPC_TASK_ASYNC,
101 };
e4eff1a6 102 struct rpc_task *task;
884be175
AV
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
ed7e9ad0 108 NFS_PROTO(dir)->unlink_setup(&msg, data->dentry, inode);
884be175
AV
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
ed7e9ad0 116static int nfs_call_unlink(struct dentry *dentry, struct inode *inode, struct nfs_unlinkdata *data)
884be175
AV
117{
118 struct inode *dir = d_inode(dentry->d_parent);
565277f6
TM
119 struct dentry *alias;
120
884be175
AV
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)) {
73ca1001 128 int ret;
b1942c5f 129 void *devname_garbage = NULL;
609005c3 130
565277f6
TM
131 /*
132 * Hey, we raced with lookup... See if we need to transfer
133 * the sillyrename information to the aliased dentry.
134 */
565277f6 135 spin_lock(&alias->d_lock);
884be175 136 if (d_really_is_positive(alias) &&
609005c3 137 !(alias->d_flags & DCACHE_NFSFS_RENAMED)) {
b1942c5f 138 devname_garbage = alias->d_fsdata;
565277f6 139 alias->d_fsdata = data;
fccca7fc 140 alias->d_flags |= DCACHE_NFSFS_RENAMED;
565277f6 141 ret = 1;
73ca1001
JL
142 } else
143 ret = 0;
565277f6 144 spin_unlock(&alias->d_lock);
565277f6 145 dput(alias);
884be175 146 up_read_non_owner(&NFS_I(dir)->rmdir_sem);
b1942c5f
AV
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 */
73ca1001 152 kfree(devname_garbage);
565277f6
TM
153 return ret;
154 }
884be175 155 data->dentry = alias;
ed7e9ad0 156 nfs_do_call_unlink(inode, data);
565277f6
TM
157 return 1;
158}
159
1da177e4
LT
160/**
161 * nfs_async_unlink - asynchronous unlinking of a file
e4eff1a6 162 * @dir: parent directory of dentry
1da177e4
LT
163 * @dentry: dentry to unlink
164 */
779c5179 165static int
beffb8fe 166nfs_async_unlink(struct dentry *dentry, const struct qstr *name)
1da177e4 167{
e4eff1a6
TM
168 struct nfs_unlinkdata *data;
169 int status = -ENOMEM;
b1942c5f 170 void *devname_garbage = NULL;
1da177e4 171
bd647545 172 data = kzalloc(sizeof(*data), GFP_KERNEL);
e4eff1a6 173 if (data == NULL)
1da177e4 174 goto out;
884be175
AV
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;
1da177e4 179
a52458b4 180 data->cred = get_current_cred();
d346890b 181 data->res.dir_attr = &data->dir_attr;
884be175 182 init_waitqueue_head(&data->wq);
1da177e4 183
e4eff1a6 184 status = -EBUSY;
1da177e4 185 spin_lock(&dentry->d_lock);
e4eff1a6
TM
186 if (dentry->d_flags & DCACHE_NFSFS_RENAMED)
187 goto out_unlock;
1da177e4 188 dentry->d_flags |= DCACHE_NFSFS_RENAMED;
b1942c5f 189 devname_garbage = dentry->d_fsdata;
e4eff1a6 190 dentry->d_fsdata = data;
1da177e4 191 spin_unlock(&dentry->d_lock);
b1942c5f
AV
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 */
96aa1549 197 kfree(devname_garbage);
e4eff1a6
TM
198 return 0;
199out_unlock:
200 spin_unlock(&dentry->d_lock);
a52458b4 201 put_cred(data->cred);
884be175 202 kfree(data->args.name.name);
1da177e4
LT
203out_free:
204 kfree(data);
e4eff1a6 205out:
1da177e4
LT
206 return status;
207}
208
209/**
210 * nfs_complete_unlink - Initialize completion of the sillydelete
211 * @dentry: dentry to delete
e4eff1a6 212 * @inode: inode
1da177e4
LT
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 */
218void
e4eff1a6 219nfs_complete_unlink(struct dentry *dentry, struct inode *inode)
1da177e4 220{
884be175 221 struct nfs_unlinkdata *data;
1da177e4 222
1da177e4 223 spin_lock(&dentry->d_lock);
884be175
AV
224 dentry->d_flags &= ~DCACHE_NFSFS_RENAMED;
225 data = dentry->d_fsdata;
226 dentry->d_fsdata = NULL;
1da177e4 227 spin_unlock(&dentry->d_lock);
e4eff1a6 228
ed7e9ad0 229 if (NFS_STALE(inode) || !nfs_call_unlink(dentry, inode, data))
e4eff1a6 230 nfs_free_unlinkdata(data);
1da177e4 231}
779c5179 232
d3d4152a
JL
233/* Cancel a queued async unlink. Called when a sillyrename run fails. */
234static void
235nfs_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;
b1942c5f 242 dentry->d_fsdata = NULL;
d3d4152a
JL
243 spin_unlock(&dentry->d_lock);
244 nfs_free_unlinkdata(data);
245 return;
246 }
247 spin_unlock(&dentry->d_lock);
248}
249
d3d4152a
JL
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 */
257static 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;
73ca1001 262 struct dentry *old_dentry = data->old_dentry;
d3d4152a 263
70ded201
TM
264 trace_nfs_sillyrename_rename(old_dir, old_dentry,
265 new_dir, data->new_dentry, task->tk_status);
d3d4152a 266 if (!NFS_PROTO(old_dir)->rename_done(task, old_dir, new_dir)) {
d00c5d43 267 rpc_restart_call_prepare(task);
d3d4152a
JL
268 return;
269 }
270
96f9d8c0
JL
271 if (data->complete)
272 data->complete(task, data);
d3d4152a
JL
273}
274
275/**
276 * nfs_async_rename_release - Release the sillyrename data.
277 * @calldata: the struct nfs_renamedata to be released
278 */
279static 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
2b0143b5
DH
284 if (d_really_is_positive(data->old_dentry))
285 nfs_mark_for_revalidate(d_inode(data->old_dentry));
d3d4152a 286
818a8dbe
BC
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
d3d4152a
JL
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);
a52458b4 305 put_cred(data->cred);
d3d4152a
JL
306 kfree(data);
307}
308
d3d4152a
JL
309static void nfs_rename_prepare(struct rpc_task *task, void *calldata)
310{
311 struct nfs_renamedata *data = calldata;
c6bfa1a1 312 NFS_PROTO(data->old_dir)->rename_rpc_prepare(task, data);
d3d4152a 313}
d3d4152a
JL
314
315static const struct rpc_call_ops nfs_rename_ops = {
316 .rpc_call_done = nfs_async_rename_done,
317 .rpc_release = nfs_async_rename_release,
d3d4152a 318 .rpc_call_prepare = nfs_rename_prepare,
d3d4152a
JL
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 */
0e862a40 330struct rpc_task *
d3d4152a 331nfs_async_rename(struct inode *old_dir, struct inode *new_dir,
96f9d8c0
JL
332 struct dentry *old_dentry, struct dentry *new_dentry,
333 void (*complete)(struct rpc_task *, struct nfs_renamedata *))
d3d4152a
JL
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 };
d3d4152a 344
dfb4f309 345 data = kzalloc(sizeof(*data), GFP_KERNEL);
d3d4152a
JL
346 if (data == NULL)
347 return ERR_PTR(-ENOMEM);
1174dd1f 348 task_setup_data.callback_data = data;
d3d4152a 349
a52458b4 350 data->cred = get_current_cred();
d3d4152a
JL
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;
a4118ee1 358 ihold(old_dir);
d3d4152a 359 data->new_dir = new_dir;
a4118ee1 360 ihold(new_dir);
d3d4152a
JL
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);
96f9d8c0 365 data->complete = complete;
d3d4152a
JL
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
f2c2c552 379 NFS_PROTO(data->old_dir)->rename_setup(&msg, old_dentry, new_dentry);
d3d4152a 380
f7732d65 381 return rpc_run_task(&task_setup_data);
d3d4152a
JL
382}
383
96f9d8c0
JL
384/*
385 * Perform tasks needed when a sillyrename is done such as cancelling the
386 * queued async unlink if it failed.
387 */
388static void
389nfs_complete_sillyrename(struct rpc_task *task, struct nfs_renamedata *data)
390{
f7be7284
JL
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);
96f9d8c0
JL
403}
404
c2dd1378
TM
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
779c5179
JL
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.
674e405b
BF
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.))
779c5179
JL
433 */
434int
435nfs_sillyrename(struct inode *dir, struct dentry *dentry)
436{
437 static unsigned int sillycounter;
c2dd1378
TM
438 unsigned char silly[SILLYNAME_LEN + 1];
439 unsigned long long fileid;
779c5179 440 struct dentry *sdentry;
3cb3fd6d 441 struct inode *inode = d_inode(dentry);
d3d4152a 442 struct rpc_task *task;
4f5829d7 443 int error = -EBUSY;
779c5179 444
6de1472f
AV
445 dfprintk(VFS, "NFS: silly-rename(%pd2, ct=%d)\n",
446 dentry, d_count(dentry));
779c5179
JL
447 nfs_inc_stats(dir, NFSIOS_SILLYRENAME);
448
449 /*
450 * We don't allow a dentry to be silly-renamed twice.
451 */
779c5179
JL
452 if (dentry->d_flags & DCACHE_NFSFS_RENAMED)
453 goto out;
454
2b0143b5 455 fileid = NFS_FILEID(d_inode(dentry));
779c5179 456
779c5179
JL
457 sdentry = NULL;
458 do {
c2dd1378 459 int slen;
779c5179
JL
460 dput(sdentry);
461 sillycounter++;
c2dd1378
TM
462 slen = scnprintf(silly, sizeof(silly),
463 SILLYNAME_PREFIX "%0*llx%0*x",
464 SILLYNAME_FILEID_LEN, fileid,
465 SILLYNAME_COUNTER_LEN, sillycounter);
779c5179 466
6de1472f
AV
467 dfprintk(VFS, "NFS: trying to rename %pd to %s\n",
468 dentry, silly);
779c5179
JL
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;
2b0143b5 477 } while (d_inode(sdentry) != NULL); /* need negative lookup */
779c5179 478
3cb3fd6d
TM
479 ihold(inode);
480
d3d4152a
JL
481 /* queue unlink first. Can't do this from rpc_release as it
482 * has to allocate memory
483 */
884be175 484 error = nfs_async_unlink(dentry, &sdentry->d_name);
d3d4152a
JL
485 if (error)
486 goto out_dput;
487
488 /* run the rename task, undo unlink if it fails */
96f9d8c0
JL
489 task = nfs_async_rename(dir, dir, dentry, sdentry,
490 nfs_complete_sillyrename);
d3d4152a
JL
491 if (IS_ERR(task)) {
492 error = -EBUSY;
493 nfs_cancel_async_unlink(dentry);
494 goto out_dput;
779c5179 495 }
d3d4152a
JL
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;
5a7a613a
TM
501 switch (error) {
502 case 0:
503 /* The rename succeeded */
504 nfs_set_verifier(dentry, nfs_save_change_attribute(dir));
3cb3fd6d
TM
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);
5a7a613a
TM
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 }
d3d4152a
JL
519 rpc_put_task(task);
520out_dput:
3cb3fd6d 521 iput(inode);
779c5179
JL
522 dput(sdentry);
523out:
524 return error;
525}