2
* Copyright (C) 2007-2008 Junjiro Okajima
2
* Copyright (C) 2005-2008 Junjiro Okajima
4
4
* This program, aufs is free software; you can redistribute it and/or modify
5
5
* it under the terms of the GNU General Public License as published by
381
381
struct inode *dir;
382
382
struct dentry *dentry;
384
struct vfsub_args *vargs;
387
387
static void au_call_vfsub_mkdir(void *args)
389
389
struct au_vfsub_mkdir_args *a = args;
390
*a->errp = vfsub_mkdir(a->dir, a->dentry, a->mode, a->dlgt);
390
*a->errp = vfsub_mkdir(a->dir, a->dentry, a->mode, a->vargs);
393
int vfsub_sio_mkdir(struct inode *dir, struct dentry *dentry, int mode,
393
int vfsub_sio_mkdir(struct au_hinode *hdir, struct dentry *dentry, int mode,
396
396
int err, do_sio, wkq_err;
397
struct inode *dir = hdir->hi_inode;
398
struct au_hin_ignore ign;
399
struct vfsub_args vargs;
398
401
LKTRTrace("i%lu, %.*s\n", dir->i_ino, AuDLNPair(dentry));
403
vfsub_args_init(&vargs, &ign, dlgt, /*force_unlink*/0);
404
vfsub_ign_hinode(&vargs, IN_CREATE, hdir);
400
405
do_sio = au_test_h_perm_sio(dir, MAY_EXEC | MAY_WRITE, dlgt);
402
err = vfsub_mkdir(dir, dentry, mode, dlgt);
407
err = vfsub_mkdir(dir, dentry, mode, &vargs);
404
409
struct au_vfsub_mkdir_args args = {
407
412
.dentry = dentry,
416
vfsub_fclr(vargs.flags, DLGT);
411
417
wkq_err = au_wkq_wait(au_call_vfsub_mkdir, &args, /*dlgt*/0);
412
418
if (unlikely(wkq_err))
430
436
*a->errp = vfsub_rmdir(a->dir, a->dentry, a->vargs);
433
int vfsub_sio_rmdir(struct inode *dir, struct dentry *dentry, int dlgt)
439
int vfsub_sio_rmdir(struct au_hinode *hdir, struct dentry *dentry, int dlgt)
435
441
int err, do_sio, wkq_err;
442
struct inode *dir = hdir->hi_inode;
443
struct au_hin_ignore ign;
436
444
struct vfsub_args vargs;
438
446
LKTRTrace("i%lu, %.*s\n", dir->i_ino, AuDLNPair(dentry));
440
vfsub_args_init(&vargs, /*ign*/NULL, dlgt, /*force_unlink*/0);
448
vfsub_args_init(&vargs, &ign, dlgt, /*force_unlink*/0);
449
vfsub_ign_hinode(&vargs, IN_DELETE, hdir);
441
450
do_sio = au_test_h_perm_sio(dir, MAY_EXEC | MAY_WRITE, dlgt);
443
452
err = vfsub_rmdir(dir, dentry, &vargs);
461
struct au_vfsub_notify_change_args {
463
struct dentry *dentry;
465
struct vfsub_args *vargs;
468
static void au_call_vfsub_notify_change(void *args)
470
struct au_vfsub_notify_change_args *a = args;
471
*a->errp = vfsub_notify_change(a->dentry, a->ia, a->vargs);
474
int vfsub_sio_notify_change(struct dentry *dentry, struct iattr *ia)
477
struct vfsub_args vargs;
478
struct au_vfsub_notify_change_args args = {
485
LKTRTrace("%.*s, 0x%x\n", AuDLNPair(dentry), ia->ia_valid);
487
vfsub_args_init(&vargs, /*ign*/NULL, /*dlgt*/0, /*force_unlink*/0);
488
wkq_err = au_wkq_wait(au_call_vfsub_notify_change, &args, /*dlgt*/0);
489
if (unlikely(wkq_err))
496
470
/* ---------------------------------------------------------------------- */
498
472
struct notify_change_args {
542
int vfsub_sio_notify_change(struct au_hinode *hdir, struct dentry *dentry,
546
struct au_hin_ignore ign;
547
struct vfsub_args vargs;
549
struct notify_change_args args = {
556
LKTRTrace("%.*s, 0x%x\n", AuDLNPair(dentry), ia->ia_valid);
558
vfsub_args_init(&vargs, &ign, /*dlgt*/0, /*force_unlink*/0);
559
events = vfsub_events_notify_change(ia);
561
vfsub_ign_hinode(&vargs, events, hdir);
562
wkq_err = au_wkq_wait(call_notify_change, &args, /*dlgt*/0);
563
if (unlikely(wkq_err))
567
570
/* ---------------------------------------------------------------------- */
569
572
struct unlink_args {
589
592
h_inode = a->dentry->d_inode;
591
594
atomic_inc_return(&h_inode->i_count);
595
vfsub_ignore(a->vargs);
592
596
*a->errp = do_vfsub_unlink(a->dir, a->dentry);
597
if (unlikely(*a->errp || (a->dentry->d_flags & DCACHE_NFSFS_RENAMED)))
598
vfsub_unignore(a->vargs);
599
au_dbg_hin_list(a->vargs);
593
600
if (!stop_sillyrename)