~ubuntu-branches/ubuntu/vivid/aufs/vivid

« back to all changes in this revision

Viewing changes to fs/aufs25/vfsub.c

  • Committer: Bazaar Package Importer
  • Author(s): Julian Andres Klode
  • Date: 2008-08-21 14:58:54 UTC
  • mfrom: (1.1.8 upstream) (4.1.1 lenny)
  • Revision ID: james.westby@ubuntu.com-20080821145854-4b49x09r4zmvlk5o
Tags: 0+20080719-4
01_vserver_apparmor.dpatch: [UPDATE] Disable vserver patches on kernel 
2.6.26, because they are not needed anymore. (Closes: #495921)

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
1
/*
2
 
 * Copyright (C) 2007-2008 Junjiro Okajima
 
2
 * Copyright (C) 2005-2008 Junjiro Okajima
3
3
 *
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
19
19
/*
20
20
 * sub-routines for VFS
21
21
 *
22
 
 * $Id: vfsub.c,v 1.6 2008/06/09 01:10:49 sfjro Exp $
 
22
 * $Id: vfsub.c,v 1.9 2008/07/07 01:12:39 sfjro Exp $
23
23
 */
24
24
 
25
25
#include <linux/uaccess.h>
381
381
        struct inode *dir;
382
382
        struct dentry *dentry;
383
383
        int mode;
384
 
        int dlgt;
 
384
        struct vfsub_args *vargs;
385
385
};
386
386
 
387
387
static void au_call_vfsub_mkdir(void *args)
388
388
{
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);
391
391
}
392
392
 
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,
394
394
                    int dlgt)
395
395
{
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;
397
400
 
398
401
        LKTRTrace("i%lu, %.*s\n", dir->i_ino, AuDLNPair(dentry));
399
402
 
 
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);
401
406
        if (!do_sio)
402
 
                err = vfsub_mkdir(dir, dentry, mode, dlgt);
 
407
                err = vfsub_mkdir(dir, dentry, mode, &vargs);
403
408
        else {
404
409
                struct au_vfsub_mkdir_args args = {
405
410
                        .errp   = &err,
406
411
                        .dir    = dir,
407
412
                        .dentry = dentry,
408
413
                        .mode   = mode,
409
 
                        .dlgt   = 0
 
414
                        .vargs  = &vargs
410
415
                };
 
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))
413
419
                        err = wkq_err;
430
436
        *a->errp = vfsub_rmdir(a->dir, a->dentry, a->vargs);
431
437
}
432
438
 
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)
434
440
{
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;
437
445
 
438
446
        LKTRTrace("i%lu, %.*s\n", dir->i_ino, AuDLNPair(dentry));
439
447
 
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);
442
451
        if (!do_sio)
443
452
                err = vfsub_rmdir(dir, dentry, &vargs);
458
467
        return err;
459
468
}
460
469
 
461
 
struct au_vfsub_notify_change_args {
462
 
        int *errp;
463
 
        struct dentry *dentry;
464
 
        struct iattr *ia;
465
 
        struct vfsub_args *vargs;
466
 
};
467
 
 
468
 
static void au_call_vfsub_notify_change(void *args)
469
 
{
470
 
        struct au_vfsub_notify_change_args *a = args;
471
 
        *a->errp = vfsub_notify_change(a->dentry, a->ia, a->vargs);
472
 
}
473
 
 
474
 
int vfsub_sio_notify_change(struct dentry *dentry, struct iattr *ia)
475
 
{
476
 
        int err, wkq_err;
477
 
        struct vfsub_args vargs;
478
 
        struct au_vfsub_notify_change_args args = {
479
 
                .errp           = &err,
480
 
                .dentry         = dentry,
481
 
                .ia             = ia,
482
 
                .vargs          = &vargs
483
 
        };
484
 
 
485
 
        LKTRTrace("%.*s, 0x%x\n", AuDLNPair(dentry), ia->ia_valid);
486
 
 
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))
490
 
                err = wkq_err;
491
 
 
492
 
        AuTraceErr(err);
493
 
        return err;
494
 
}
495
 
 
496
470
/* ---------------------------------------------------------------------- */
497
471
 
498
472
struct notify_change_args {
522
496
                        au_update_fuse_h_inode(NULL, a->h_dentry); /*ignore*/
523
497
                else
524
498
                        vfsub_unignore(a->vargs);
 
499
                au_dbg_hin_list(a->vargs);
525
500
        }
526
501
        AuTraceErr(*a->errp);
527
502
}
564
539
        return err;
565
540
}
566
541
 
 
542
int vfsub_sio_notify_change(struct au_hinode *hdir, struct dentry *dentry,
 
543
                            struct iattr *ia)
 
544
{
 
545
        int err, wkq_err;
 
546
        struct au_hin_ignore ign;
 
547
        struct vfsub_args vargs;
 
548
        __u32 events;
 
549
        struct notify_change_args args = {
 
550
                .errp           = &err,
 
551
                .h_dentry       = dentry,
 
552
                .ia             = ia,
 
553
                .vargs          = &vargs
 
554
        };
 
555
 
 
556
        LKTRTrace("%.*s, 0x%x\n", AuDLNPair(dentry), ia->ia_valid);
 
557
 
 
558
        vfsub_args_init(&vargs, &ign, /*dlgt*/0, /*force_unlink*/0);
 
559
        events = vfsub_events_notify_change(ia);
 
560
        if (events)
 
561
                vfsub_ign_hinode(&vargs, events, hdir);
 
562
        wkq_err = au_wkq_wait(call_notify_change, &args, /*dlgt*/0);
 
563
        if (unlikely(wkq_err))
 
564
                err = wkq_err;
 
565
 
 
566
        AuTraceErr(err);
 
567
        return err;
 
568
}
 
569
 
567
570
/* ---------------------------------------------------------------------- */
568
571
 
569
572
struct unlink_args {
589
592
        h_inode = a->dentry->d_inode;
590
593
        if (h_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)
594
601
                dput(a->dentry);
595
602
        if (h_inode)