static int do_pri_inode(aufs_bindex_t bindex, struct inode *inode, int hn, struct dentry *wh) { char *n = NULL; int l = 0; if (!inode || IS_ERR(inode)) { dpri("i%d: err %ld\n", bindex, PTR_ERR(inode)); return -1; } /* the type of i_blocks depends upon CONFIG_LBDAF */ BUILD_BUG_ON(sizeof(inode->i_blocks) != sizeof(unsigned long) && sizeof(inode->i_blocks) != sizeof(u64)); if (wh) { n = (void *)wh->d_name.name; l = wh->d_name.len; } dpri("i%d: %p, i%lu, %s, cnt %d, nl %u, 0%o, sz %llu, blk %llu," " hn %d, ct %lld, np %lu, st 0x%lx, f 0x%x, v %llu, g %x%s%.*s\n", bindex, inode, inode->i_ino, inode->i_sb ? au_sbtype(inode->i_sb) : "??", atomic_read(&inode->i_count), inode->i_nlink, inode->i_mode, i_size_read(inode), (unsigned long long)inode->i_blocks, hn, (long long)timespec_to_ns(&inode->i_ctime) & 0x0ffff, inode->i_mapping ? inode->i_mapping->nrpages : 0, inode->i_state, inode->i_flags, inode->i_version, inode->i_generation, l ? ", wh " : "", l, n); return 0; }
static int do_pri_dentry(aufs_bindex_t bindex, struct dentry *dentry) { struct dentry *wh = NULL; int hn; if (!dentry || IS_ERR(dentry)) { dpri("d%d: err %ld\n", bindex, PTR_ERR(dentry)); return -1; } /* do not call dget_parent() here */ /* note: access d_xxx without d_lock */ dpri("d%d: %.*s?/%.*s, %s, cnt %d, flags 0x%x\n", bindex, AuDLNPair(dentry->d_parent), AuDLNPair(dentry), dentry->d_sb ? au_sbtype(dentry->d_sb) : "??", d_count(dentry), dentry->d_flags); hn = -1; if (bindex >= 0 && dentry->d_inode && au_test_aufs(dentry->d_sb)) { struct au_iinfo *iinfo = au_ii(dentry->d_inode); if (iinfo) { hn = !!au_hn(iinfo->ii_hinode + bindex); wh = iinfo->ii_hinode[0 + bindex].hi_whdentry; } } do_pri_inode(bindex, dentry->d_inode, hn, wh); return 0; }
static int do_pri_br(aufs_bindex_t bindex, struct au_branch *br) { struct vfsmount *mnt; struct super_block *sb; if (!br || IS_ERR(br)) goto out; mnt = au_br_mnt(br); if (!mnt || IS_ERR(mnt)) goto out; sb = mnt->mnt_sb; if (!sb || IS_ERR(sb)) goto out; dpri("s%d: {perm 0x%x, id %d, cnt %d, wbr %p}, " "%s, dev 0x%02x%02x, flags 0x%lx, cnt %d, active %d, " "xino %d\n", bindex, br->br_perm, br->br_id, atomic_read(&br->br_count), br->br_wbr, au_sbtype(sb), MAJOR(sb->s_dev), MINOR(sb->s_dev), sb->s_flags, sb->s_count, atomic_read(&sb->s_active), !!br->br_xino.xi_file); return 0; out: dpri("s%d: err %ld\n", bindex, PTR_ERR(br)); return -1; }
void au_dbg_iattr(struct iattr *ia) { #define AuBit(name) \ do { \ if (ia->ia_valid & ATTR_ ## name) \ dpri(#name "\n"); \ } while (0) AuBit(MODE); AuBit(UID); AuBit(GID); AuBit(SIZE); AuBit(ATIME); AuBit(MTIME); AuBit(CTIME); AuBit(ATIME_SET); AuBit(MTIME_SET); AuBit(FORCE); AuBit(ATTR_FLAG); AuBit(KILL_SUID); AuBit(KILL_SGID); AuBit(FILE); AuBit(KILL_PRIV); AuBit(OPEN); AuBit(TIMES_SET); #undef AuBit dpri("ia_file %p\n", ia->ia_file); }
void dpri(int64 u) { ff(debug,"Node %d:\n",u); int64 son = 0; TRA(x,u) ff(debug,"SON%d: %d\n",++son,lk[x].v); TRA(x,u) dpri(lk[x].v); }
void au_dpri_vdir(struct au_vdir *vdir) { unsigned long ul; union au_vdir_deblk_p p; unsigned char *o; if (!vdir || IS_ERR(vdir)) { dpri("err %ld\n", PTR_ERR(vdir)); return; } dpri("deblk %u, nblk %lu, deblk %p, last{%lu, %p}, ver %lu\n", vdir->vd_deblk_sz, vdir->vd_nblk, vdir->vd_deblk, vdir->vd_last.ul, vdir->vd_last.p.deblk, vdir->vd_version); for (ul = 0; ul < vdir->vd_nblk; ul++) { p.deblk = vdir->vd_deblk[ul]; o = p.deblk; dpri("[%lu]: %p\n", ul, o); } }
void au_dpri_sb(struct super_block *sb) { struct au_sbinfo *sbinfo; aufs_bindex_t bindex; int err; /* to reuduce stack size */ struct { struct vfsmount mnt; struct au_branch fake; } *a; /* this function can be called from magic sysrq */ a = kzalloc(sizeof(*a), GFP_ATOMIC); if (unlikely(!a)) { dpri("no memory\n"); return; } a->mnt.mnt_sb = sb; a->fake.br_perm = 0; a->fake.br_path.mnt = &a->mnt; a->fake.br_xino.xi_file = NULL; atomic_set(&a->fake.br_count, 0); smp_mb(); /* atomic_set */ err = do_pri_br(-1, &a->fake); kfree(a); dpri("dev 0x%x\n", sb->s_dev); if (err || !au_test_aufs(sb)) return; sbinfo = au_sbi(sb); if (!sbinfo) return; dpri("nw %d, gen %u, kobj %d\n", atomic_read(&sbinfo->si_nowait.nw_len), sbinfo->si_generation, atomic_read(&sbinfo->si_kobj.kref.refcount)); for (bindex = 0; bindex <= sbinfo->si_bend; bindex++) do_pri_br(bindex, sbinfo->si_branch[0 + bindex]); }
static int do_pri_file(aufs_bindex_t bindex, struct file *file) { char a[32]; if (!file || IS_ERR(file)) { dpri("f%d: err %ld\n", bindex, PTR_ERR(file)); return -1; } a[0] = 0; if (bindex < 0 && file->f_dentry && au_test_aufs(file->f_dentry->d_sb) && au_fi(file)) snprintf(a, sizeof(a), ", gen %d, mmapped %d", au_figen(file), atomic_read(&au_fi(file)->fi_mmapped)); dpri("f%d: mode 0x%x, flags 0%o, cnt %ld, v %llu, pos %llu%s\n", bindex, file->f_mode, file->f_flags, (long)file_count(file), file->f_version, file->f_pos, a); if (file->f_dentry) do_pri_dentry(bindex, file->f_dentry); return 0; }
static int do_pri_dentry(aufs_bindex_t bindex, struct dentry *dentry) { struct dentry *wh = NULL; if (!dentry || IS_ERR(dentry)) { dpri("d%d: err %ld\n", bindex, PTR_ERR(dentry)); return -1; } /* do not call dget_parent() here */ dpri("d%d: %.*s?/%.*s, %s, cnt %d, flags 0x%x\n", bindex, AuDLNPair(dentry->d_parent), AuDLNPair(dentry), dentry->d_sb ? au_sbtype(dentry->d_sb) : "??", atomic_read(&dentry->d_count), dentry->d_flags); if (bindex >= 0 && dentry->d_inode && au_test_aufs(dentry->d_sb)) { struct au_iinfo *iinfo = au_ii(dentry->d_inode); if (iinfo) wh = iinfo->ii_hinode[0 + bindex].hi_whdentry; } do_pri_inode(bindex, dentry->d_inode, wh); return 0; }
void au_dpri_whlist(struct au_nhash *whlist) { unsigned long ul, n; struct hlist_head *head; struct au_vdir_wh *pos; n = whlist->nh_num; head = whlist->nh_head; for (ul = 0; ul < n; ul++) { hlist_for_each_entry(pos, head, wh_hash) dpri("b%d, %.*s, %d\n", pos->wh_bindex, pos->wh_str.len, pos->wh_str.name, pos->wh_str.len); head++; } }
void au_dpri_inode(struct inode *inode) { struct au_iinfo *iinfo; aufs_bindex_t bindex; int err; err = do_pri_inode(-1, inode, NULL); if (err || !au_test_aufs(inode->i_sb)) return; iinfo = au_ii(inode); if (!iinfo) return; dpri("i-1: bstart %d, bend %d, gen %d\n", iinfo->ii_bstart, iinfo->ii_bend, au_iigen(inode)); if (iinfo->ii_bstart < 0) return; for (bindex = iinfo->ii_bstart; bindex <= iinfo->ii_bend; bindex++) do_pri_inode(bindex, iinfo->ii_hinode[0 + bindex].hi_inode, iinfo->ii_hinode[0 + bindex].hi_whdentry); }
void au_dpri_dentry(struct dentry *dentry) { struct au_dinfo *dinfo; aufs_bindex_t bindex; int err; err = do_pri_dentry(-1, dentry); if (err || !au_test_aufs(dentry->d_sb)) return; dinfo = au_di(dentry); if (!dinfo) return; dpri("d-1: bstart %d, bend %d, bwh %d, bdiropq %d, gen %d\n", dinfo->di_bstart, dinfo->di_bend, dinfo->di_bwh, dinfo->di_bdiropq, au_digen(dentry)); if (dinfo->di_bstart < 0) return; for (bindex = dinfo->di_bstart; bindex <= dinfo->di_bend; bindex++) do_pri_dentry(bindex, dinfo->di_hdentry[0 + bindex].hd_dentry); }