24
24
#include <linux/statfs.h>
26
26
#include <linux/version.h>
27
#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)
27
#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 20)
28
28
#include <linux/mnt_namespace.h>
29
29
typedef struct mnt_namespace au_mnt_ns_t;
30
30
#define au_nsproxy(tsk) (tsk)->nsproxy
31
31
#define au_mnt_ns(tsk) (tsk)->nsproxy->mnt_ns
32
#elif LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,19)
32
#elif LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 19)
33
33
#include <linux/namespace.h>
34
34
typedef struct namespace au_mnt_ns_t;
35
35
#define au_nsproxy(tsk) (tsk)->nsproxy
36
36
#define au_mnt_ns(tsk) (tsk)->nsproxy->namespace
37
#elif LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,18)
37
#elif LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 18)
38
38
#include <linux/namespace.h>
39
39
typedef struct namespace au_mnt_ns_t;
40
40
#define au_nsproxy(tsk) (tsk)->namespace
68
68
LKTRTrace("i%lu\n", inode->i_ino);
69
69
au_iinfo_fin(inode);
70
cache_free_icntnr(container_of(inode, struct aufs_icntnr, vfs_inode));
70
au_cache_free_icntnr(container_of(inode, struct aufs_icntnr,
73
74
//todo: how about merge with alloc_inode()?
74
75
static void aufs_read_inode(struct inode *inode)
79
static struct backing_dev_info bdi = {
80
.ra_pages = 0, /* No readahead */
81
.capabilities = BDI_CAP_NO_ACCT_DIRTY | BDI_CAP_NO_WRITEBACK
78
85
LKTRTrace("i%lu\n", inode->i_ino);
107
114
bend = sbend(sb);
108
115
for (bindex = 0; !err && bindex <= bend; bindex++) {
109
err = br_perm_str(a, sizeof(a), sbr_perm(sb, bindex));
111
err = seq_path(seq, sbr_mnt(sb, bindex),
112
au_h_dptr_i(root, bindex), au_esc_chars);
116
err = seq_path(seq, sbr_mnt(sb, bindex),
117
au_h_dptr_i(root, bindex), au_esc_chars);
114
err = seq_printf(seq, "=%s", a);
121
au_optstr_br_perm(sbr_perm(sb, bindex)));
115
122
if (!err && bindex != bend)
116
123
err = seq_putc(seq, ':');
127
134
struct aufs_sbinfo *sbinfo;
128
135
struct dentry *root;
129
136
struct file *xino;
137
struct au_opts_flags def;
133
141
sb = mnt->mnt_sb;
134
142
root = sb->s_root;
135
aufs_read_lock(root, !AUFS_I_RLOCK);
136
if (au_flag_test(sb, AuFlag_XINO)) {
143
aufs_read_lock(root, !AuLock_IR);
145
if (AuFlag(sbinfo, f_xino) == AuXino_XINO) {
137
146
err = seq_puts(m, ",xino=");
138
147
if (unlikely(err))
140
xino = stobr(sb, 0)->br_xino;
149
xino = sbinfo->si_xib;
141
150
err = seq_path(m, xino->f_vfsmnt, xino->f_dentry, au_esc_chars);
142
151
if (unlikely(err <= 0))
152
161
err = seq_puts(m, ",noxino");
154
n = au_flag_test(sb, AuFlag_PLINK);
155
if (unlikely(!err && (AuDefFlags & AuFlag_PLINK) != n))
156
err = seq_printf(m, ",%splink", n ? "" : "no");
157
n = au_flag_test_udba(sb);
158
if (unlikely(!err && (AuDefFlags & AuMask_UDBA) != n))
159
err = seq_printf(m, ",udba=%s", udba_str(n));
160
n = au_flag_test(sb, AuFlag_ALWAYS_DIROPQ);
161
if (unlikely(!err && (AuDefFlags & AuFlag_ALWAYS_DIROPQ) != n))
163
au_opts_flags_def(&def);
165
#define Print(name) do { \
166
n = AuFlag(sbinfo, f_##name); \
167
if (unlikely(!err && n != def.f_##name)) \
168
err = seq_printf(m, ",%s"#name, n ? "" : "no"); \
171
#define PrintStr(name, str) do { \
172
n = AuFlag(sbinfo, f_##name); \
173
if (unlikely(!err && n != def.f_##name)) \
174
err = seq_printf(m, "," str "=%s", au_optstr_##name(n)); \
179
PrintStr(udba, "udba");
180
switch (AuFlag(sbinfo, f_wbr_create)) {
181
case AuWbrCreate_TDP:
183
case AuWbrCreate_MFS:
184
case AuWbrCreate_PMFS:
185
PrintStr(wbr_create, "create");
187
case AuWbrCreate_MFSV:
188
err = seq_printf(m, ",create=mfs:%lu",
189
sbinfo->si_wbr_mfs.mfs_expire / HZ);
191
case AuWbrCreate_PMFSV:
192
err = seq_printf(m, ",create=pmfs:%lu",
193
sbinfo->si_wbr_mfs.mfs_expire / HZ);
195
case AuWbrCreate_MFSRR:
196
err = seq_printf(m, ",create=mfsrr:%Lu",
197
sbinfo->si_wbr_mfs.mfsrr_watermark);
199
case AuWbrCreate_MFSRRV:
200
err = seq_printf(m, ",create=mfsrr:%Lu:%lu",
201
sbinfo->si_wbr_mfs.mfsrr_watermark,
202
sbinfo->si_wbr_mfs.mfs_expire / HZ);
208
PrintStr(wbr_copyup, "cpup");
209
n = AuFlag(sbinfo, f_always_diropq);
210
if (unlikely(!err && n != def.f_always_diropq))
162
211
err = seq_printf(m, ",diropq=%c", n ? 'a' : 'w');
163
n = au_flag_test(sb, AuFlag_DLGT);
164
if (unlikely(!err && (AuDefFlags & AuFlag_DLGT) != n))
165
err = seq_printf(m, ",%sdlgt", n ? "" : "no");
166
n = au_flag_test(sb, AuFlag_WARN_PERM);
167
if (unlikely(!err && (AuDefFlags & AuFlag_WARN_PERM) != n))
168
err = seq_printf(m, ",%swarn_perm", n ? "" : "no");
171
217
n = sbinfo->si_dirwh;
172
218
if (unlikely(!err && n != AUFS_DIRWH_DEF))
173
219
err = seq_printf(m, ",dirwh=%d", n);
174
220
n = sbinfo->si_rdcache / HZ;
175
221
if (unlikely(!err && n != AUFS_RDCACHE_DEF))
176
222
err = seq_printf(m, ",rdcache=%d", n);
178
n = au_flag_test_coo(sb);
179
if (unlikely(!err && (AuDefFlags & AuMask_COO) != n))
180
err = seq_printf(m, ",coo=%s", coo_str(n));
224
PrintStr(coo, "coo");
183
229
if (!err && !sysaufs_brs) {
184
230
#ifdef CONFIG_AUFS_COMPAT
223
err = vfsub_statfs(StatfsArg(arg), buf, need_dlgt(StatfsSb(arg)));
269
err = vfsub_statfs(StatfsArg(arg), buf, au_need_dlgt(StatfsSb(arg)));
224
270
//if (LktrCond) err = -1;
225
271
StatfsUnlock(arg);
227
//buf->f_type = AUFS_SUPER_MAGIC;
273
buf->f_type = AUFS_SUPER_MAGIC;
229
275
buf->f_namelen -= AUFS_WH_PFX_LEN;
276
//todo: support uuid?
230
277
memset(&buf->f_fsid, 0, sizeof(buf->f_fsid));
232
//buf->f_bsize = buf->f_blocks = buf->f_bfree = buf->f_bavail = -1;
279
/* buf->f_bsize = buf->f_blocks = buf->f_bfree = buf->f_bavail = -1; */
238
285
static void au_update_mnt(struct vfsmount *mnt)
240
#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,18)
287
#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 18)
241
288
struct vfsmount *pos;
242
289
struct super_block *sb = mnt->mnt_sb;
243
290
struct dentry *root = sb->s_root;
244
291
struct aufs_sbinfo *sbinfo = stosi(sb);
248
295
AuDebugOn(!kernel_locked());
250
297
if (sbinfo->si_mnt != mnt
282
328
struct vfsmount *mnt = UmountBeginMnt(arg);
283
329
struct aufs_sbinfo *sbinfo;
287
333
sbinfo = stosi(sb);
288
334
if (unlikely(!sbinfo))
292
flush_scheduled_work();
294
wait_event(sbinfo->si_wkq_nowait_wq,
295
!atomic_read(&sbinfo->si_wkq_nowait));
297
337
si_write_lock(sb);
298
if (au_flag_test(sb, AuFlag_PLINK))
338
if (AuFlag(sbinfo, f_plink))
299
339
au_put_plink(sb);
301
341
if (unlikely(au_flag_test(sb, AuFlag_UDBA_INOTIFY)))
302
342
shrink_dcache_sb(sb);
304
344
au_update_mnt(mnt);
346
if (sbinfo->si_wbr_create_ops->fin)
347
sbinfo->si_wbr_create_ops->fin(sb);
305
349
si_write_unlock(sb);
308
static void free_sbinfo(struct aufs_sbinfo *sbinfo)
352
static void free_sbinfo(struct super_block *sb)
312
|| !list_empty(&sbinfo->si_plink)
313
/* || atomic_read(&sbinfo->si_wkq_nowait) */
354
struct aufs_sbinfo *sbinfo;
358
AuDebugOn(!sbinfo || !list_empty(&sbinfo->si_plink));
316
362
free_branches(sbinfo);
317
363
kfree(sbinfo->si_branch);
318
//destroy_workqueue(sbinfo->si_wkq);
333
379
sysaufs_del(sbinfo);
335
381
#if !UmountBeginHasMnt
336
// umount_begin() may not be called.
382
/* umount_begin() may not be called. */
337
383
aufs_umount_begin(sb);
342
388
/* ---------------------------------------------------------------------- */
345
* refresh directories at remount time.
391
* refresh dentry and inode at remount time.
347
static int do_refresh_dir(struct dentry *dentry, unsigned int flags)
393
static int do_refresh(struct dentry *dentry, mode_t type,
394
unsigned int dir_flags)
350
397
struct dentry *parent;
351
398
struct inode *inode;
353
LKTRTrace("%.*s\n", DLNPair(dentry));
400
LKTRTrace("%.*s, 0%o\n", AuDLNPair(dentry), type);
354
401
inode = dentry->d_inode;
355
AuDebugOn(!inode || !S_ISDIR(inode->i_mode));
357
404
di_write_lock_child(dentry);
358
405
parent = dget_parent(dentry);
359
di_read_lock_parent(parent, AUFS_I_RLOCK);
360
err = au_refresh_hdentry(dentry, S_IFDIR);
406
di_read_lock_parent(parent, AuLock_IR);
407
/* returns a number of positive dentries */
408
err = au_refresh_hdentry(dentry, type);
362
411
err = au_refresh_hinode(inode, dentry);
364
au_reset_hinotify(inode, flags);
413
if (unlikely(!err && type == S_IFDIR))
414
au_reset_hinotify(inode, dir_flags);
366
416
if (unlikely(err))
367
Err("unrecoverable error %d\n", err);
368
di_read_unlock(parent, AUFS_I_RLOCK);
417
AuErr("unrecoverable error %d, %.*s\n", err, AuDLNPair(dentry));
418
di_read_unlock(parent, AuLock_IR);
370
420
di_write_unlock(dentry);
378
428
return S_ISDIR(dentry->d_inode->i_mode);
381
static int refresh_dir(struct dentry *root, int sgen)
431
static int refresh_dir(struct dentry *root, au_gen_t sgen)
383
int err, i, j, ndentry;
433
int err, i, j, ndentry, e;
384
434
const unsigned int flags = au_hi_flags(root->d_inode, /*isdir*/1);
385
435
struct au_dcsub_pages dpages;
386
436
struct au_dpage *dpage;
387
437
struct dentry **dentries;
389
440
LKTRTrace("sgen %d\n", sgen);
390
441
SiMustWriteLock(root->d_sb);
391
AuDebugOn(au_digen(root) != sgen);
392
DiMustWriteLock(root);
394
err = au_dpages_init(&dpages, GFP_KERNEL);
442
AuDebugOn(au_digen(root) != sgen
443
|| !kernel_locked());
446
list_for_each_entry(inode, &root->d_sb->s_inodes, i_sb_list)
447
if (unlikely(S_ISDIR(inode->i_mode)
448
&& au_iigen(inode) != sgen)) {
449
ii_write_lock_child(inode);
450
e = au_refresh_hinode_self(inode);
452
ii_write_unlock(inode);
454
LKTRTrace("e %d, i%lu\n", e, inode->i_ino);
457
/* go on even if err */
461
e = au_dpages_init(&dpages, GFP_TEMPORARY);
397
err = au_dcsub_pages(&dpages, root, test_dir, NULL);
467
e = au_dcsub_pages(&dpages, root, test_dir, NULL);
401
DiMustNoWaiters(root);
402
IiMustNoWaiters(root->d_inode);
403
di_write_unlock(root);
404
for (i = 0; !err && i < dpages.ndpage; i++) {
475
for (i = 0; !e && i < dpages.ndpage; i++) {
405
476
dpage = dpages.dpages + i;
406
477
dentries = dpage->dentries;
407
478
ndentry = dpage->ndentry;
408
for (j = 0; !err && j < ndentry; j++) {
479
for (j = 0; !e && j < ndentry; j++) {
409
480
struct dentry *d;
411
482
#ifdef CONFIG_AUFS_DEBUG
421
if (au_digen(d) != sgen)
422
err = do_refresh_dir(d, flags);
425
di_write_lock_child(root); /* aufs_write_lock() calls ..._child() */
428
au_dpages_free(&dpages);
492
if (au_digen(d) != sgen) {
493
e = do_refresh(d, S_IFDIR, flags);
495
if (unlikely(e && !err))
503
au_dpages_free(&dpages);
509
static int test_nondir(struct dentry *dentry, void *arg)
511
return !S_ISDIR(dentry->d_inode->i_mode);
514
static int refresh_nondir(struct dentry *root, au_gen_t sgen, int do_dentry)
516
int err, i, j, ndentry, e;
517
struct au_dcsub_pages dpages;
518
struct au_dpage *dpage;
519
struct dentry **dentries;
522
LKTRTrace("sgen %d\n", sgen);
523
SiMustWriteLock(root->d_sb);
524
AuDebugOn(au_digen(root) != sgen
525
|| !kernel_locked());
528
list_for_each_entry(inode, &root->d_sb->s_inodes, i_sb_list)
529
if (unlikely(!S_ISDIR(inode->i_mode)
530
&& au_iigen(inode) != sgen)) {
531
ii_write_lock_child(inode);
532
e = au_refresh_hinode_self(inode);
534
ii_write_unlock(inode);
536
LKTRTrace("e %d, i%lu\n", e, inode->i_ino);
539
/* go on even if err */
543
if (unlikely(!do_dentry))
546
e = au_dpages_init(&dpages, GFP_TEMPORARY);
552
e = au_dcsub_pages(&dpages, root, test_nondir, NULL);
559
for (i = 0; i < dpages.ndpage; i++) {
560
dpage = dpages.dpages + i;
561
dentries = dpage->dentries;
562
ndentry = dpage->ndentry;
563
for (j = 0; j < ndentry; j++) {
566
#ifdef CONFIG_AUFS_DEBUG
568
struct dentry *parent;
569
parent = dget_parent(d);
570
AuDebugOn(S_ISDIR(d->d_inode->i_mode)
571
|| au_digen(parent) != sgen);
576
if (inode && au_digen(d) != sgen) {
577
e = do_refresh(d, inode->i_mode & S_IFMT, 0);
579
if (unlikely(e && !err))
587
au_dpages_free(&dpages);
434
593
/* stop extra interpretation of errno in mount(8), and strange error messages */
435
594
static int cvt_err(int err)
469
628
memset(&opts, 0, sizeof(opts));
470
opts.opt = (void*)__get_free_page(GFP_KERNEL);
629
opts.opt = (void *)__get_free_page(GFP_TEMPORARY);
471
630
//if (LktrCond) {free_page((unsigned long)opts.opt); opts.opt = NULL;}
472
631
if (unlikely(!opts.opt))
474
633
opts.max_opt = PAGE_SIZE / sizeof(*opts.opt);
476
636
/* parse it before aufs lock */
477
err = au_parse_opts(sb, data, &opts);
637
err = au_opts_parse(sb, data, &opts);
478
638
//if (LktrCond) {au_free_opts(&opts); err = -1;}
479
639
if (unlikely(err))
482
642
sbinfo = stosi(sb);
483
//Dbg("%d\n", atomic_read(&sbinfo->si_wkq_nowait));
485
flush_scheduled_work();
487
err = wait_event_interruptible(sbinfo->si_wkq_nowait_wq,
488
!atomic_read(&sbinfo->si_wkq_nowait));
493
643
root = sb->s_root;
494
644
inode = root->d_inode;
496
646
aufs_write_lock(root);
500
650
/* au_do_opts() may return an error */
503
err = au_do_opts_remount(sb, &opts, &do_refresh, &given);
651
err = au_opts_remount(sb, &opts);
504
652
//if (LktrCond) err = -1;
655
if (opts.refresh_dir || opts.refresh_nondir) {
510
dlgt = au_flag_test(sb, AuFlag_DLGT);
511
au_flag_clr(sb, AuFlag_DLGT);
659
dlgt = au_need_dlgt(sb);
660
AuFlagSet(sbinfo, f_dlgt, 0);
512
661
au_sigen_inc(sb);
513
662
au_reset_hinotify(inode, au_hi_flags(inode, /*isdir*/1));
663
sigen = au_sigen(sb);
514
664
sbinfo->si_failed_refresh_dirs = 0;
515
rerr = refresh_dir(root, au_sigen(sb));
666
DiMustNoWaiters(root);
667
IiMustNoWaiters(root->d_inode);
668
di_write_unlock(root);
670
rerr = refresh_dir(root, sigen);
516
671
if (unlikely(rerr)) {
517
672
sbinfo->si_failed_refresh_dirs = 1;
518
Warn("Refreshing directories failed, ignores (%d)\n",
673
AuWarn("Refreshing directories failed, ignores (%d)\n",
677
if (unlikely(opts.refresh_nondir)) {
679
rerr = refresh_nondir(root, sigen, !rerr);
681
AuWarn("Refreshing non-directories failed,"
682
" ignores (%d)\n", rerr);
686
/* aufs_write_lock() calls ..._child() */
687
di_write_lock_child(root);
521
689
au_cpup_attr_all(inode);
522
au_flag_set(sb, dlgt);
690
AuFlagSet(sbinfo, f_dlgt, dlgt);
525
693
aufs_write_unlock(root);
694
vfsub_i_unlock(inode);
695
if (opts.refresh_dir)
528
696
sysaufs_notify_remount();
531
699
free_page((unsigned long)opts.opt);
533
701
err = cvt_err(err);
535
703
//au_debug_off();
584
752
rw_init_wlock(&sbinfo->si_rwsem);
585
753
sbinfo->si_generation = 0;
754
//sbinfo->si_generation = INT_MAX - 2;
586
755
sbinfo->si_failed_refresh_dirs = 0;
587
756
sbinfo->si_bend = -1;
588
757
sbinfo->si_last_br_id = 0;
589
sbinfo->si_flags = AuDefFlags;
590
atomic_long_set(&sbinfo->si_xino, AUFS_FIRST_INO);
592
sbinfo->si_wkq = create_workqueue(AUFS_WKQ_NAME);
593
if (IS_ERR(sbinfo->si_wkq))
597
atomic_set(&sbinfo->si_wkq_nowait, 0);
598
init_waitqueue_head(&sbinfo->si_wkq_nowait_wq);
759
sbinfo->si_wbr_copyup_ops = au_wbr_copyup_ops + AuWbrCopyup_TDP;
760
sbinfo->si_wbr_create_ops = au_wbr_create_ops + AuWbrCreate_TDP;
762
au_opts_flags_def(&sbinfo->au_si_flags);
764
sbinfo->si_xread = NULL;
765
sbinfo->si_xwrite = NULL;
766
sbinfo->si_xib = NULL;
767
mutex_init(&sbinfo->si_xib_mtx);
768
sbinfo->si_xib_buf = NULL;
769
/* leave si_xib_last_pindex and si_xib_next_bit */
771
au_nwt_init(&sbinfo->si_nowait);
600
773
sbinfo->si_rdcache = AUFS_RDCACHE_DEF * HZ;
601
774
sbinfo->si_dirwh = AUFS_DIRWH_DEF;
602
776
spin_lock_init(&sbinfo->si_plink_lock);
603
777
INIT_LIST_HEAD(&sbinfo->si_plink);
779
/* leave syaufs members, si_list, si_mnt and si_sysaufs. */
604
781
init_lvma(sbinfo);
606
782
sb->s_fs_info = sbinfo;
607
784
#ifdef ForceInotify
608
udba_set(sb, AuFlag_UDBA_INOTIFY);
785
AuFlagSet(sbinfo, f_udba, AuUdba_INOTIFY);
611
au_flag_set(sb, AuFlag_DLGT);
788
AuFlagSet(sbinfo, f_dlgt, 1);
613
790
#ifdef ForceNoPlink
614
au_flag_clr(sb, AuFlag_PLINK);
791
AuFlagSet(sbinfo, f_plink, 0);
794
AuFlagSet(sbinfo, f_xino, AuXino_NONE);
797
AuFlagSet(sbinfo, f_refrof, 0);
616
799
return 0; /* success */
619
802
kfree(sbinfo->si_branch);
675
859
struct dentry *root;
676
860
struct inode *inode;
678
862
char *arg = raw_data;
681
865
if (unlikely(!arg || !*arg)) {
686
870
LKTRTrace("%s, silent %d\n", arg, silent);
689
873
memset(&opts, 0, sizeof(opts));
690
opts.opt = (void*)__get_free_page(GFP_KERNEL);
874
opts.opt = (void *)__get_free_page(GFP_TEMPORARY);
691
875
//if (LktrCond) {free_page((unsigned long)opts.opt); opts.opt = NULL;}
692
876
if (unlikely(!opts.opt))
694
878
opts.max_opt = PAGE_SIZE / sizeof(*opts.opt);
696
880
err = alloc_sbinfo(sb);
697
//if (LktrCond) {si_write_unlock(sb);free_sbinfo(stosi(sb));err=-1;}
881
//if (LktrCond) {si_write_unlock(sb);free_sbinfo(sb);err=-1;}
698
882
if (unlikely(err))
700
884
SiMustWriteLock(sb);
701
885
/* all timestamps always follow the ones on the branch */
702
886
sb->s_flags |= MS_NOATIME | MS_NODIRATIME;
703
887
sb->s_op = &aufs_sop;
888
sb->s_magic = AUFS_SUPER_MAGIC;
704
889
au_init_export_op(sb);
706
891
err = alloc_root(sb);
724
909
ii_write_lock_parent(inode);
725
910
aufs_write_unlock(root);
726
err = au_parse_opts(sb, arg, &opts);
727
//if (LktrCond) {au_free_opts(&opts); err = -1;}
911
err = au_opts_parse(sb, arg, &opts);
912
//if (LktrCond) {au_opts_free(&opts); err = -1;}
728
913
if (unlikely(err))
731
916
/* lock vfs_inode first, then aufs. */
733
918
inode->i_op = &aufs_dir_iop;
734
919
inode->i_fop = &aufs_dir_fop;
735
920
aufs_write_lock(root);
737
922
sb->s_maxbytes = 0;
738
err = au_do_opts_mount(sb, &opts);
923
err = au_opts_mount(sb, &opts);
739
924
//if (LktrCond) err = -1;
741
926
if (unlikely(err))
743
928
AuDebugOn(!sb->s_maxbytes);
746
931
aufs_write_unlock(root);
932
vfsub_i_unlock(inode);
749
934
goto out_opts; /* success */
752
937
aufs_write_unlock(root);
938
vfsub_i_unlock(inode);
756
941
sb->s_root = NULL;
758
free_sbinfo(stosi(sb));
759
944
sb->s_fs_info = NULL;
761
946
free_page((unsigned long)opts.opt);
764
949
err = cvt_err(err);
766
951
//au_debug_off();
770
955
/* ---------------------------------------------------------------------- */
772
#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,18)
957
#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 18)
773
958
static int aufs_get_sb(struct file_system_type *fs_type, int flags,
774
959
const char *dev_name, void *raw_data,
775
960
struct vfsmount *mnt)
794
979
return get_sb_nodev(fs_type, flags, raw_data, aufs_fill_super);
981
#endif /* LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 18) */
798
983
struct file_system_type aufs_fs_type = {
799
984
.name = AUFS_FSTYPE,
800
.fs_flags = FS_REVAL_DOT, // for UDBA and NFS branch
985
.fs_flags = FS_REVAL_DOT, /* for UDBA and NFS branch */
801
986
.get_sb = aufs_get_sb,
802
987
.kill_sb = generic_shutdown_super,
803
//no need to __module_get() and module_put().
988
/* no need to __module_get() and module_put(). */
804
989
.owner = THIS_MODULE,