296
buf = kmalloc(s->to - s->from + 1, GFP_KERNEL);
296
buf = kmalloc(s->to - s->from + 1, GFP_NOFS);
299
299
memcpy(buf, s->from, s->to - s->from);
344
static noinline_for_stack int
345
au_wbr_create_val(char *str, struct au_opt_wbr_create *create)
344
static noinline_for_stack
345
int au_wbr_create_val(char *str, struct au_opt_wbr_create *create)
348
348
substring_t args[MAX_OPT_ARGS];
672
672
int au_opts_parse(struct super_block *sb, unsigned long flags, char *str,
673
673
struct au_opts *opts)
675
int err, n, token, skipped;
676
676
struct dentry *root;
677
677
struct au_opt *opt, *opt_tail;
678
678
char *opt_str, *p;
679
substring_t args[MAX_OPT_ARGS];
680
679
aufs_bindex_t bindex, bend;
680
unsigned char skipped;
683
682
struct au_opt_del *del;
684
683
struct au_opt_mod *mod;
688
687
struct au_opt_wbr_create *create;
690
689
struct file *file;
690
/* reduce the stack space */
692
substring_t args[MAX_OPT_ARGS];
692
696
LKTRTrace("%s, nopts %d\n", str, opts->max_opt);
699
a = kmalloc(sizeof(*a), GFP_NOFS);
694
703
root = sb->s_root;
699
708
opt->type = Opt_tail;
700
709
while (!err && (opt_str = strsep(&str, ",")) && *opt_str) {
702
token = match_token(opt_str, options, args);
703
LKTRTrace("%s, token %d, args[0]{%p, %p}\n",
704
opt_str, token, args[0].from, args[0].to);
711
token = match_token(opt_str, options, a->args);
712
LKTRTrace("%s, token %d, a->args[0]{%p, %p}\n",
713
opt_str, token, a->args[0].from, a->args[0].to);
710
while (!err && (opt_str = strsep(&args[0].from, ":"))
719
while (!err && (opt_str = strsep(&a->args[0].from, ":"))
712
721
err = opt_add(opt, opt_str, sb, bindex++);
713
722
if (unlikely(!err && ++opt > opt_tail)) {
722
if (unlikely(match_int(&args[0], &n))) {
731
if (unlikely(match_int(&a->args[0], &n))) {
723
732
AuErr("bad integer in %s\n", opt_str);
727
err = opt_add(opt, args[1].from, sb, bindex);
736
err = opt_add(opt, a->args[1].from, sb, bindex);
730
err = opt_add(opt, args[0].from, sb, /*dummy bindex*/1);
739
err = opt_add(opt, a->args[0].from, sb,
732
742
opt->type = token;
734
744
case Opt_prepend:
735
err = opt_add(opt, args[0].from, sb, /*bindex*/0);
745
err = opt_add(opt, a->args[0].from, sb, /*bindex*/0);
737
747
opt->type = token;
740
750
u.del = &opt->del;
741
u.del->path = args[0].from;
751
u.del->path = a->args[0].from;
742
752
LKTRTrace("del path %s\n", u.del->path);
743
753
/* LSM may detect it */
744
754
/* do not superio. */
745
755
err = vfsub_path_lookup(u.del->path, lkup_dirflags,
747
757
if (unlikely(err)) {
748
758
AuErr("lookup failed %s (%d)\n",
749
759
u.del->path, err);
752
u.del->h_root = dget(nd.path.dentry);
762
u.del->h_root = dget(a->nd.path.dentry);
763
path_put(&a->nd.path);
754
764
opt->type = token;
756
766
#if 0 /* reserved for future use */
758
768
u.del = &opt->del;
759
769
u.del->path = "(indexed)";
760
if (unlikely(match_int(&args[0], &n))) {
770
if (unlikely(match_int(&a->args[0], &n))) {
761
771
AuErr("bad integer in %s\n", opt_str);
778
788
u.mod = &opt->mod;
779
u.mod->path = args[0].from;
789
u.mod->path = a->args[0].from;
780
790
p = strchr(u.mod->path, '=');
781
791
if (unlikely(!p)) {
782
792
AuErr("no permssion %s\n", opt_str);
789
799
/* LSM may detect it */
790
800
/* do not superio. */
791
801
err = vfsub_path_lookup(u.mod->path, lkup_dirflags,
793
803
if (unlikely(err)) {
794
804
AuErr("lookup failed %s (%d)\n",
795
805
u.mod->path, err);
798
u.mod->h_root = dget(nd.path.dentry);
808
u.mod->h_root = dget(a->nd.path.dentry);
809
path_put(&a->nd.path);
800
810
opt->type = token;
802
812
#ifdef IMOD /* reserved for future use */
804
814
u.mod = &opt->mod;
805
815
u.mod->path = "(indexed)";
806
if (unlikely(match_int(&args[0], &n))) {
816
if (unlikely(match_int(&a->args[0], &n))) {
807
817
AuErr("bad integer in %s\n", opt_str);
814
824
aufs_read_unlock(root, !AuLock_IR);
817
u.mod->perm = br_perm_val(args[1].from);
827
u.mod->perm = br_perm_val(a->args[1].from);
818
828
LKTRTrace("mod path %s, perm 0x%x, %s\n",
819
u.mod->path, u.mod->perm, args[1].from);
829
u.mod->path, u.mod->perm, a->args[1].from);
821
831
u.mod->h_root = dget(au_h_dptr(root, bindex));
822
832
opt->type = token;
827
837
u.xino = &opt->xino;
828
file = au_xino_create(sb, args[0].from, /*silent*/0,
838
file = au_xino_create(sb, a->args[0].from, /*silent*/0);
830
839
err = PTR_ERR(file);
831
840
if (IS_ERR(file))
834
843
if (unlikely(file->f_dentry->d_sb == sb)) {
836
AuErr("%s must be outside\n", args[0].from);
845
AuErr("%s must be outside\n", a->args[0].from);
840
849
u.xino->file = file;
841
u.xino->path = args[0].from;
850
u.xino->path = a->args[0].from;
842
851
opt->type = token;
845
854
#if 0 /* def CONFIG_AUFS_EXPORT */ /* reserved for futur use */
846
855
case Opt_xinodir:
847
856
u.xinodir = &opt->xinodir;
848
u.xinodir->name = args[0].from;
857
u.xinodir->name = a->args[0].from;
849
858
err = vfsub_path_lookup(u.xinodir->name, lkup_dirflags,
851
860
if (unlikely(err)) {
852
861
AuErr("lookup failed %s (%d)\n",
853
862
u.xinodir->name, err);
856
u.xinodir->path = nd.path;
865
u.xinodir->path = a->nd.path;
857
866
/* do not path_put() */
858
867
opt->type = token;
862
871
case Opt_trunc_xino_path:
863
872
u.xino_itrunc = &opt->xino_itrunc;
865
874
LKTRTrace("trunc_xino path %s\n", p);
866
875
/* LSM may detect it */
867
876
/* do not superio. */
868
err = vfsub_path_lookup(p, lkup_dirflags, &nd);
877
err = vfsub_path_lookup(p, lkup_dirflags, &a->nd);
869
878
if (unlikely(err)) {
870
879
AuErr("lookup failed %s (%d)\n", p , err);
874
883
aufs_read_lock(root, AuLock_FLUSH);
875
884
bend = au_sbend(sb);
876
885
for (bindex = 0; bindex <= bend; bindex++) {
877
if (au_h_dptr(root, bindex) == nd.path.dentry) {
886
if (au_h_dptr(root, bindex)
887
== a->nd.path.dentry) {
878
888
u.xino_itrunc->bindex = bindex;
882
892
aufs_read_unlock(root, !AuLock_IR);
893
path_put(&a->nd.path);
884
894
if (unlikely(u.xino_itrunc->bindex < 0)) {
885
895
AuErr("no such branch %s\n", p);
892
902
case Opt_itrunc_xino:
893
903
u.xino_itrunc = &opt->xino_itrunc;
894
if (unlikely(match_int(&args[0], &n))) {
904
if (unlikely(match_int(&a->args[0], &n))) {
895
905
AuErr("bad integer in %s\n", opt_str);
911
if (unlikely(match_int(&args[0], &opt->dirwh)))
921
if (unlikely(match_int(&a->args[0], &opt->dirwh)))
914
924
opt->type = token;
917
927
case Opt_rdcache:
918
if (unlikely(match_int(&args[0], &opt->rdcache)))
928
if (unlikely(match_int(&a->args[0], &opt->rdcache)))
921
931
opt->type = token;
967
977
case Opt_wbr_create:
968
978
u.create = &opt->wbr_create;
969
979
u.create->wbr_create
970
= au_wbr_create_val(args[0].from, u.create);
980
= au_wbr_create_val(a->args[0].from, u.create);
971
981
if (u.create->wbr_create >= 0) {
973
983
opt->type = token;
975
985
AuErr("wrong value, %s\n", opt_str);
977
987
case Opt_wbr_copyup:
978
opt->wbr_copyup = au_wbr_copyup_val(args[0].from);
988
opt->wbr_copyup = au_wbr_copyup_val(a->args[0].from);
979
989
if (opt->wbr_copyup >= 0) {
981
991
opt->type = token;
1289
static noinline_for_stack int
1290
verify_opts(struct super_block *sb, unsigned int pending, int remount)
1302
static int verify_opts(struct super_block *sb, unsigned int pending,
1293
1306
aufs_bindex_t bindex, bend;
1365
au_hdir_lock(h_dir, dir, bindex);
1378
mutex_lock_nested(&h_dir->i_mutex, AuLsc_I_PARENT);
1366
1379
br_wh_write_lock(br);
1367
1380
err = au_wh_init(au_h_dptr(root, bindex), br,
1368
au_nfsmnt(sb, bindex), sb);
1381
au_nfsmnt(sb, bindex), sb, bindex);
1369
1382
br_wh_write_unlock(br);
1370
au_hdir_unlock(h_dir, dir, bindex);
1383
mutex_unlock(&h_dir->i_mutex);
1373
1386
AuTraceErr(err);
1443
1456
/* enable xino */
1444
1457
if (au_opt_test(tmp, XINO) && !opt_xino) {
1445
1458
struct au_opt_xino xino;
1459
struct au_branch *br;
1447
1461
xino.file = au_xino_def(sb);
1448
1462
err = PTR_ERR(xino.file);
1449
1463
if (IS_ERR(xino.file))
1466
br = sbinfo->si_xino_def_br;
1452
1467
err = au_xino_set(sb, &xino, /*remount*/0);
1453
1468
fput(xino.file);
1454
1469
if (unlikely(err))
1471
sbinfo->si_xino_def_br = br;
1458
1474
/* restore hinotify */