int au_fi_realloc(struct au_finfo *finfo, int nbr) { int err, sz; struct au_hfile *hfp; err = -ENOMEM; sz = sizeof(*hfp) * (finfo->fi_bend + 1); if (!sz) sz = sizeof(*hfp); hfp = au_kzrealloc(finfo->fi_hfile, sz, sizeof(*hfp) * nbr, GFP_NOFS); if (hfp) { finfo->fi_hfile = hfp; err = 0; } return err; }
int au_di_realloc(struct au_dinfo *dinfo, int nbr) { int err, sz; struct au_hdentry *hdp; AuRwMustWriteLock(&dinfo->di_rwsem); err = -ENOMEM; sz = sizeof(*hdp) * (dinfo->di_bend + 1); if (!sz) sz = sizeof(*hdp); hdp = au_kzrealloc(dinfo->di_hdentry, sz, sizeof(*hdp) * nbr, GFP_NOFS); if (hdp) { dinfo->di_hdentry = hdp; err = 0; } return err; }
int au_sbr_realloc(struct au_sbinfo *sbinfo, int nbr) { int err, sz; struct au_branch **brp; AuRwMustWriteLock(&sbinfo->si_rwsem); err = -ENOMEM; sz = sizeof(*brp) * (sbinfo->si_bend + 1); if (unlikely(!sz)) sz = sizeof(*brp); brp = au_kzrealloc(sbinfo->si_branch, sz, sizeof(*brp) * nbr, GFP_NOFS); if (brp) { sbinfo->si_branch = brp; err = 0; } return err; }
void au_warn_loopback(struct super_block *h_sb) { int i, new_nelem; unsigned long *a, magic; static DEFINE_SPINLOCK(spin); magic = h_sb->s_magic; spin_lock(&spin); a = au_warn_loopback_array; for (i = 0; i < au_warn_loopback_nelem && *a; i++) if (a[i] == magic) { spin_unlock(&spin); return; } /* h_sb is new to us, print it */ if (i < au_warn_loopback_nelem) { a[i] = magic; goto pr; } /* expand the array */ new_nelem = au_warn_loopback_nelem + au_warn_loopback_step; a = au_kzrealloc(au_warn_loopback_array, au_warn_loopback_nelem * sizeof(unsigned long), new_nelem * sizeof(unsigned long), GFP_ATOMIC, /*may_shrink*/0); if (a) { au_warn_loopback_nelem = new_nelem; au_warn_loopback_array = a; a[i] = magic; goto pr; } spin_unlock(&spin); AuWarn1("realloc failed, ignored\n"); return; pr: spin_unlock(&spin); pr_warn("you may want to try another patch for loopback file " "on %s(0x%lx) branch\n", au_sbtype(h_sb), magic); }
int au_fidir_realloc(struct au_finfo *finfo, int nbr) { int err; struct au_fidir *fidir, *p; AuRwMustWriteLock(&finfo->fi_rwsem); fidir = finfo->fi_hdir; AuDebugOn(!fidir); err = -ENOMEM; p = au_kzrealloc(fidir, au_fidir_sz(fidir->fd_nent), au_fidir_sz(nbr), GFP_NOFS); if (p) { p->fd_nent = nbr; finfo->fi_hdir = p; err = 0; } return err; }
static int au_dpages_append(struct au_dcsub_pages *dpages, struct dentry *dentry, gfp_t gfp) { int err, sz; struct au_dpage *dpage; void *p; dpage = dpages->dpages + dpages->ndpage - 1; sz = PAGE_SIZE / sizeof(dentry); if (unlikely(dpage->ndentry >= sz)) { AuLabel(new dpage); err = -ENOMEM; sz = dpages->ndpage * sizeof(*dpages->dpages); p = au_kzrealloc(dpages->dpages, sz, sz + sizeof(*dpages->dpages), gfp); if (unlikely(!p)) goto out; dpages->dpages = p; dpage = dpages->dpages + dpages->ndpage; p = (void *)__get_free_page(gfp); if (unlikely(!p)) goto out; dpage->ndentry = 0; dpage->dentries = p; dpages->ndpage++; } /* d_count can be zero */ dpage->dentries[dpage->ndentry++] = dget_locked(dentry); return 0; /* success */ out: return err; }
static int au_dpages_append(struct au_dcsub_pages *dpages, struct dentry *dentry, gfp_t gfp) { int err, sz; struct au_dpage *dpage; void *p; //TraceEnter(); dpage = dpages->dpages + dpages->ndpage - 1; AuDebugOn(!dpage); sz = PAGE_SIZE / sizeof(dentry); if (unlikely(dpage->ndentry >= sz)) { LKTRLabel(new dpage); err = -ENOMEM; sz = dpages->ndpage * sizeof(*dpages->dpages); p = au_kzrealloc(dpages->dpages, sz, sz + sizeof(*dpages->dpages), gfp); if (unlikely(!p)) goto out; dpage = dpages->dpages + dpages->ndpage; p = (void*)__get_free_page(gfp); if (unlikely(!p)) goto out; dpage->ndentry = 0; dpage->dentries = p; dpages->ndpage++; } dpage->dentries[dpage->ndentry++] = dget(dentry); return 0; /* success */ out: //TraceErr(err); return err; }