int au_plink(char cwd[], int cmd, int begin_maint, int end_maint) { int err, nbr; struct mntent ent; char **br; if (begin_maint) au_plink_maint(cwd); err = au_proc_getmntent(cwd, &ent); if (err) AuFin("no such mount point"); if (hasmntopt(&ent, "noplink")) goto out; /* success */ #ifdef DEBUG //char a[] = "a,b,br:/tmp/br0=rw:/br1=ro"; char a[] = "a,b,si=1,c"; ent.mnt_opts = a; #endif err = au_br(&br, &nbr, &ent); //printf("nbr %d\n", nbr); if (err) AuFin(NULL); err = do_plink(cwd, cmd, nbr, br); if (err) AuFin(NULL); out: if (end_maint) au_plink_maint(NULL); return err; }
/* todo: there are some cases which options are not changed */ static void update_mtab(FILE *fp, char *mntpnt, int do_remount, int do_verbose) { int err; long pos; FILE *ofp; struct mntent ent, *p; /* prohibit updating mount options for this mntpnt */ au_plink_maint(mntpnt); err = au_proc_getmntent(mntpnt, &ent); if (err) AuFin("no such mount point"); ofp = setmntent(MTab, "r"); if (!ofp) AuFin(MTab); if (do_remount) { /* find the last one */ pos = -1; while ((p = getmntent(ofp))) { if (!strcmp(p->mnt_dir, mntpnt)) pos = ftell(ofp); } rewind(ofp); if (pos > 0) { while ((p = getmntent(ofp))) { if (ftell(ofp) == pos) { /* replace the line */ p = &ent; pos = -1; } err = addmntent(fp, p); if (err) AuFin("addmntent"); } if (pos > 0) AuFin("internal error"); } else append_mtab(fp, ofp, &ent); } else append_mtab(fp, ofp, &ent); endmntent(ofp); /* ignore */ au_plink_maint(NULL); if (do_verbose) au_print_ent(&ent); }
int si_write_lock(struct super_block *sb, int flags) { int err; if (au_ftest_lock(flags, FLUSH)) au_nwt_flush(&au_sbi(sb)->si_nowait); si_noflush_write_lock(sb); err = au_plink_maint(sb, flags); if (unlikely(err)) si_write_unlock(sb); return err; }