taglinefilesource code
dquot46fs/dquot.cstatic struct dquot *hash_table[NR_DQHASH];
dquot47fs/dquot.cstatic struct dquot *first_dquot;
dquot67fs/dquot.cstatic inline struct dquot **const hash(kdev_t dev, unsigned int id, short type)
dquot80fs/dquot.cstatic void insert_dquot_free(struct dquot *dquot)
dquot82fs/dquot.cdquot->dq_next = first_dquot;
dquot83fs/dquot.cdquot->dq_prev = first_dquot->dq_prev;
dquot84fs/dquot.cdquot->dq_next->dq_prev = dquot;
dquot85fs/dquot.cdquot->dq_prev->dq_next = dquot;
dquot86fs/dquot.cfirst_dquot = dquot;
dquot89fs/dquot.cstatic void remove_dquot_free(struct dquot *dquot)
dquot91fs/dquot.cif (first_dquot == dquot)
dquot93fs/dquot.cif (dquot->dq_next)
dquot94fs/dquot.cdquot->dq_next->dq_prev = dquot->dq_prev;
dquot95fs/dquot.cif (dquot->dq_prev)
dquot96fs/dquot.cdquot->dq_prev->dq_next = dquot->dq_next;
dquot97fs/dquot.cdquot->dq_next = dquot->dq_prev = NODQUOT;
dquot100fs/dquot.cstatic void insert_dquot_hash(struct dquot *dquot)
dquot102fs/dquot.cstruct dquot **hash_ent;
dquot104fs/dquot.chash_ent = hash(dquot->dq_dev, dquot->dq_id, dquot->dq_type);
dquot105fs/dquot.cdquot->dq_hash_next = *hash_ent;
dquot106fs/dquot.cdquot->dq_hash_prev = NODQUOT;
dquot107fs/dquot.cif (dquot->dq_hash_next)
dquot108fs/dquot.cdquot->dq_hash_next->dq_hash_prev = dquot;
dquot109fs/dquot.c*hash_ent = dquot;
dquot112fs/dquot.cstatic void remove_dquot_hash(struct dquot *dquot)
dquot114fs/dquot.cstruct dquot **hash_ent;
dquot116fs/dquot.chash_ent = hash(dquot->dq_dev, dquot->dq_id, dquot->dq_type);
dquot117fs/dquot.cif (*hash_ent == dquot)
dquot118fs/dquot.c*hash_ent = dquot->dq_hash_next;
dquot119fs/dquot.cif (dquot->dq_hash_next)
dquot120fs/dquot.cdquot->dq_hash_next->dq_hash_prev = dquot->dq_hash_prev;
dquot121fs/dquot.cif (dquot->dq_hash_prev)
dquot122fs/dquot.cdquot->dq_hash_prev->dq_hash_next = dquot->dq_hash_next;
dquot123fs/dquot.cdquot->dq_hash_prev = dquot->dq_hash_next = NODQUOT;
dquot126fs/dquot.cstatic void put_last_free(struct dquot *dquot)
dquot128fs/dquot.cremove_dquot_free(dquot);
dquot129fs/dquot.cdquot->dq_prev = first_dquot->dq_prev;
dquot130fs/dquot.cdquot->dq_prev->dq_next = dquot;
dquot131fs/dquot.cdquot->dq_next = first_dquot;
dquot132fs/dquot.cdquot->dq_next->dq_prev = dquot;
dquot137fs/dquot.cstruct dquot *dquot;
dquot140fs/dquot.cif (!(dquot = (struct dquot*) get_free_page(GFP_KERNEL)))
dquot143fs/dquot.ccnt = PAGE_SIZE / sizeof(struct dquot);
dquot147fs/dquot.cdquot->dq_next = dquot->dq_prev = first_dquot = dquot++;
dquot151fs/dquot.cinsert_dquot_free(dquot++);
dquot157fs/dquot.cstatic void __wait_on_dquot(struct dquot *dquot)
dquot161fs/dquot.cadd_wait_queue(&dquot->dq_wait, &wait);
dquot164fs/dquot.cif (dquot->dq_flags & DQ_LOCKED) {
dquot165fs/dquot.cdquot->dq_flags |= DQ_WANT;
dquot169fs/dquot.cremove_wait_queue(&dquot->dq_wait, &wait);
dquot173fs/dquot.cstatic inline void wait_on_dquot(struct dquot *dquot)
dquot175fs/dquot.cif (dquot->dq_flags & DQ_LOCKED)
dquot176fs/dquot.c__wait_on_dquot(dquot);
dquot179fs/dquot.cstatic inline void lock_dquot(struct dquot *dquot)
dquot181fs/dquot.cwait_on_dquot(dquot);
dquot182fs/dquot.cdquot->dq_flags |= DQ_LOCKED;
dquot185fs/dquot.cstatic inline void unlock_dquot(struct dquot *dquot)
dquot187fs/dquot.cdquot->dq_flags &= ~DQ_LOCKED;
dquot188fs/dquot.cif (dquot->dq_flags & DQ_WANT) {
dquot189fs/dquot.cdquot->dq_flags &= ~DQ_WANT;
dquot190fs/dquot.cwake_up(&dquot->dq_wait);
dquot200fs/dquot.cstatic void clear_dquot(struct dquot * dquot)
dquot204fs/dquot.cwait_on_dquot(dquot);
dquot205fs/dquot.cremove_dquot_hash(dquot);
dquot206fs/dquot.cremove_dquot_free(dquot);
dquot207fs/dquot.cwait = ((volatile struct dquot *) dquot)->dq_wait;
dquot208fs/dquot.cif (dquot->dq_count)
dquot210fs/dquot.cmemset(dquot, 0, sizeof(*dquot));
dquot211fs/dquot.c((volatile struct dquot *) dquot)->dq_wait = wait;
dquot212fs/dquot.cinsert_dquot_free(dquot);
dquot215fs/dquot.cstatic void write_dquot(struct dquot *dquot)
dquot217fs/dquot.cshort type = dquot->dq_type;
dquot218fs/dquot.cstruct file *filp = dquot->dq_mnt->mnt_quotas[type];
dquot221fs/dquot.cif (!(dquot->dq_flags & DQ_MOD) || (filp == (struct file *)NULL))
dquot223fs/dquot.clock_dquot(dquot);
dquot224fs/dquot.cdown(&dquot->dq_mnt->mnt_sem);
dquot227fs/dquot.cdqoff(dquot->dq_id), 0) != dqoff(dquot->dq_id)) {
dquot228fs/dquot.cup(&dquot->dq_mnt->mnt_sem);
dquot229fs/dquot.cunlock_dquot(dquot);
dquot233fs/dquot.cfilp->f_pos = dqoff(dquot->dq_id);
dquot237fs/dquot.c(char *)&dquot->dq_dqb, sizeof(struct dqblk)) == sizeof(struct dqblk))
dquot238fs/dquot.cdquot->dq_flags &= ~DQ_MOD;
dquot239fs/dquot.cup(&dquot->dq_mnt->mnt_sem);
dquot241fs/dquot.cunlock_dquot(dquot);
dquot245fs/dquot.cstatic void read_dquot(struct dquot *dquot)
dquot247fs/dquot.cshort type = dquot->dq_type;
dquot248fs/dquot.cstruct file *filp = dquot->dq_mnt->mnt_quotas[type];
dquot253fs/dquot.clock_dquot(dquot);
dquot254fs/dquot.cdown(&dquot->dq_mnt->mnt_sem);
dquot257fs/dquot.cdqoff(dquot->dq_id), 0) != dqoff(dquot->dq_id)) {
dquot258fs/dquot.cup(&dquot->dq_mnt->mnt_sem);
dquot259fs/dquot.cunlock_dquot(dquot);
dquot263fs/dquot.cfilp->f_pos = dqoff(dquot->dq_id);
dquot266fs/dquot.cfilp->f_op->read(filp->f_inode, filp, (char *)&dquot->dq_dqb, sizeof(struct dqblk));
dquot267fs/dquot.cup(&dquot->dq_mnt->mnt_sem);
dquot269fs/dquot.cif (dquot->dq_bhardlimit == 0 && dquot->dq_bsoftlimit == 0 &&
dquot270fs/dquot.cdquot->dq_ihardlimit == 0 && dquot->dq_isoftlimit == 0)
dquot271fs/dquot.cdquot->dq_flags |= DQ_FAKE;
dquot272fs/dquot.cunlock_dquot(dquot);
dquot278fs/dquot.cstruct dquot *dquot = first_dquot;
dquot282fs/dquot.cfor (i = 0; i < nr_dquots * 2; i++, dquot = dquot->dq_next) {
dquot283fs/dquot.cif (dev == NODEV || dquot->dq_count == 0 || dquot->dq_dev != dev)
dquot285fs/dquot.cif (type != -1 && dquot->dq_type != type)
dquot287fs/dquot.cwait_on_dquot(dquot);
dquot288fs/dquot.cif (dquot->dq_flags & DQ_MOD)
dquot289fs/dquot.cwrite_dquot(dquot);
dquot299fs/dquot.cstruct dquot *dquot, *next;
dquot304fs/dquot.cdquot = next;
dquot305fs/dquot.cnext = dquot->dq_next;
dquot306fs/dquot.cif (dquot->dq_dev != dev || dquot->dq_type != type)
dquot308fs/dquot.cif (dquot->dq_flags & DQ_LOCKED) {
dquot312fs/dquot.cif (dquot->dq_flags & DQ_MOD)
dquot313fs/dquot.cwrite_dquot(dquot);
dquot315fs/dquot.cclear_dquot(dquot);
dquot319fs/dquot.cstatic inline void dquot_incr_inodes(struct dquot *dquot, unsigned long number)
dquot321fs/dquot.clock_dquot(dquot);
dquot322fs/dquot.cdquot->dq_curinodes += number;
dquot323fs/dquot.cdquot->dq_flags |= DQ_MOD;
dquot324fs/dquot.cunlock_dquot(dquot);
dquot327fs/dquot.cstatic inline void dquot_incr_blocks(struct dquot *dquot, unsigned long number)
dquot329fs/dquot.clock_dquot(dquot);
dquot330fs/dquot.cdquot->dq_curblocks += number;
dquot331fs/dquot.cdquot->dq_flags |= DQ_MOD;
dquot332fs/dquot.cunlock_dquot(dquot);
dquot335fs/dquot.cstatic inline void dquot_decr_inodes(struct dquot *dquot, unsigned long number)
dquot337fs/dquot.clock_dquot(dquot);
dquot338fs/dquot.cif (dquot->dq_curinodes > number)
dquot339fs/dquot.cdquot->dq_curinodes -= number;
dquot341fs/dquot.cdquot->dq_curinodes = 0;
dquot342fs/dquot.cif (dquot->dq_curinodes < dquot->dq_isoftlimit)
dquot343fs/dquot.cdquot->dq_itime = (time_t) 0;
dquot344fs/dquot.cdquot->dq_flags &= ~DQ_INODES;
dquot345fs/dquot.cdquot->dq_flags |= DQ_MOD;
dquot346fs/dquot.cunlock_dquot(dquot);
dquot349fs/dquot.cstatic inline void dquot_decr_blocks(struct dquot *dquot, unsigned long number)
dquot351fs/dquot.clock_dquot(dquot);
dquot352fs/dquot.cif (dquot->dq_curblocks > number)
dquot353fs/dquot.cdquot->dq_curblocks -= number;
dquot355fs/dquot.cdquot->dq_curblocks = 0;
dquot356fs/dquot.cif (dquot->dq_curblocks < dquot->dq_bsoftlimit)
dquot357fs/dquot.cdquot->dq_btime = (time_t) 0;
dquot358fs/dquot.cdquot->dq_flags &= ~DQ_BLKS;
dquot359fs/dquot.cdquot->dq_flags |= DQ_MOD;
dquot360fs/dquot.cunlock_dquot(dquot);
dquot363fs/dquot.cstatic inline int need_print_warning(short type, struct dquot *dquot)
dquot367fs/dquot.creturn(current->fsuid == dquot->dq_id);
dquot369fs/dquot.creturn(current->fsgid == dquot->dq_id);
dquot374fs/dquot.cstatic int check_idq(struct dquot *dquot, short type, u_long short inodes)
dquot376fs/dquot.cif (inodes <= 0 || dquot->dq_flags & DQ_FAKE)
dquot378fs/dquot.cif (dquot->dq_ihardlimit &&
dquot379fs/dquot.c(dquot->dq_curinodes + inodes) > dquot->dq_ihardlimit && !fsuser()) {
dquot380fs/dquot.cif ((dquot->dq_flags & DQ_INODES) == 0 &&
dquot381fs/dquot.cneed_print_warning(type, dquot)) {
dquot383fs/dquot.cdquot->dq_mnt->mnt_dirname, quotatypes[type]);
dquot385fs/dquot.cdquot->dq_flags |= DQ_INODES;
dquot389fs/dquot.cif (dquot->dq_isoftlimit &&
dquot390fs/dquot.c(dquot->dq_curinodes + inodes) > dquot->dq_isoftlimit &&
dquot391fs/dquot.cdquot->dq_itime && CURRENT_TIME >= dquot->dq_itime && !fsuser()) {
dquot392fs/dquot.cif (need_print_warning(type, dquot)) {
dquot394fs/dquot.cdquot->dq_mnt->mnt_dirname, quotatypes[type]);
dquot399fs/dquot.cif (dquot->dq_isoftlimit &&
dquot400fs/dquot.c(dquot->dq_curinodes + inodes) > dquot->dq_isoftlimit &&
dquot401fs/dquot.cdquot->dq_itime == 0 && !fsuser()) {
dquot402fs/dquot.cif (need_print_warning(type, dquot)) {
dquot404fs/dquot.cdquot->dq_mnt->mnt_dirname, quotatypes[type]);
dquot407fs/dquot.cdquot->dq_itime = CURRENT_TIME + dquot->dq_mnt->mnt_iexp[type];
dquot412fs/dquot.cstatic int check_bdq(struct dquot *dquot, short type, u_long blocks)
dquot414fs/dquot.cif (blocks <= 0 || dquot->dq_flags & DQ_FAKE)
dquot416fs/dquot.cif (dquot->dq_bhardlimit &&
dquot417fs/dquot.c(dquot->dq_curblocks + blocks) > dquot->dq_bhardlimit && !fsuser()) {
dquot418fs/dquot.cif ((dquot->dq_flags & DQ_BLKS) == 0 &&
dquot419fs/dquot.cneed_print_warning(type, dquot)) {
dquot421fs/dquot.cdquot->dq_mnt->mnt_dirname, quotatypes[type]);
dquot423fs/dquot.cdquot->dq_flags |= DQ_BLKS;
dquot427fs/dquot.cif (dquot->dq_bsoftlimit &&
dquot428fs/dquot.c(dquot->dq_curblocks + blocks) > dquot->dq_bsoftlimit &&
dquot429fs/dquot.cdquot->dq_btime && CURRENT_TIME >= dquot->dq_btime && !fsuser()) {
dquot430fs/dquot.cif (need_print_warning(type, dquot)) {
dquot432fs/dquot.cdquot->dq_mnt->mnt_dirname, quotatypes[type]);
dquot437fs/dquot.cif (dquot->dq_bsoftlimit &&
dquot438fs/dquot.c(dquot->dq_curblocks + blocks) > dquot->dq_bsoftlimit &&
dquot439fs/dquot.cdquot->dq_btime == 0 && !fsuser()) {
dquot440fs/dquot.cif (need_print_warning(type, dquot)) {
dquot442fs/dquot.cdquot->dq_mnt->mnt_dirname, quotatypes[type]);
dquot445fs/dquot.cdquot->dq_btime = CURRENT_TIME + dquot->dq_mnt->mnt_bexp[type];
dquot450fs/dquot.cstatic void dqput(struct dquot *dquot)
dquot452fs/dquot.cif (!dquot)
dquot459fs/dquot.cif (dquot->dq_mnt != (struct vfsmount *)NULL) {
dquot461fs/dquot.cwait_on_dquot(dquot);
dquot462fs/dquot.cif (!dquot->dq_count) {
dquot464fs/dquot.cprintk("VFS: device %s, dquot of %s %d\n", kdevname(dquot->dq_dev),
dquot465fs/dquot.cquotatypes[dquot->dq_type], dquot->dq_id);
dquot469fs/dquot.cif (dquot->dq_count > 1) {
dquot470fs/dquot.cdquot->dq_count--;
dquot474fs/dquot.cif (dquot->dq_flags & DQ_MOD) {
dquot475fs/dquot.cwrite_dquot(dquot);  /* we can sleep - so do again */
dquot476fs/dquot.cwait_on_dquot(dquot);
dquot480fs/dquot.cif (dquot->dq_count) {
dquot481fs/dquot.cdquot->dq_count--;
dquot487fs/dquot.cstatic struct dquot *get_empty_dquot(void)
dquot489fs/dquot.cstruct dquot *dquot, *best;
dquot496fs/dquot.cdquot = first_dquot;
dquot498fs/dquot.cfor (cnt = 0; cnt < nr_dquots; dquot = dquot->dq_next, cnt++) {
dquot499fs/dquot.cif (!dquot->dq_count) {
dquot501fs/dquot.cbest = dquot;
dquot502fs/dquot.cif (!(dquot->dq_flags & DQ_MOD) && !(dquot->dq_flags & DQ_LOCKED)) {
dquot503fs/dquot.cbest = dquot;
dquot513fs/dquot.cdquot = best;
dquot514fs/dquot.cif (!dquot) {
dquot519fs/dquot.cif (dquot->dq_flags & DQ_LOCKED) {
dquot520fs/dquot.cwait_on_dquot(dquot);
dquot523fs/dquot.cif (dquot->dq_flags & DQ_MOD) {
dquot524fs/dquot.cwrite_dquot(dquot);
dquot527fs/dquot.cif (dquot->dq_count)
dquot529fs/dquot.cclear_dquot(dquot);
dquot530fs/dquot.cdquot->dq_count = 1;
dquot536fs/dquot.creturn(dquot);
dquot539fs/dquot.cstatic struct dquot *dqget(kdev_t dev, unsigned int id, short type)
dquot541fs/dquot.cstruct dquot *dquot, *empty;
dquot550fs/dquot.cdquot = *(hash(dev, id, type));
dquot551fs/dquot.cwhile (dquot) {
dquot552fs/dquot.cif (dquot->dq_dev != dev || dquot->dq_id != id) {
dquot553fs/dquot.cdquot = dquot->dq_hash_next;
dquot556fs/dquot.cwait_on_dquot(dquot);
dquot557fs/dquot.cif (dquot->dq_dev != dev || dquot->dq_id != id)
dquot559fs/dquot.cif (!dquot->dq_count)
dquot561fs/dquot.cdquot->dq_count++;
dquot565fs/dquot.creturn(dquot);
dquot569fs/dquot.cdquot = empty;
dquot570fs/dquot.cdquot->dq_id = id;
dquot571fs/dquot.cdquot->dq_type = type;
dquot572fs/dquot.cdquot->dq_dev = dev;
dquot573fs/dquot.cdquot->dq_mnt = vfsmnt;
dquot574fs/dquot.cput_last_free(dquot);
dquot575fs/dquot.cinsert_dquot_hash(dquot);
dquot576fs/dquot.cread_dquot(dquot);
dquot577fs/dquot.creturn(dquot);
dquot586fs/dquot.cstruct dquot *dquot;
dquot600fs/dquot.cif ((dquot = dqget(dev, id, type)) != NODQUOT) {
dquot601fs/dquot.clock_dquot(dquot);
dquot603fs/dquot.cdquot->dq_bhardlimit = dq_dqblk.dqb_bhardlimit;
dquot604fs/dquot.cdquot->dq_bsoftlimit = dq_dqblk.dqb_bsoftlimit;
dquot605fs/dquot.cdquot->dq_ihardlimit = dq_dqblk.dqb_ihardlimit;
dquot606fs/dquot.cdquot->dq_isoftlimit = dq_dqblk.dqb_isoftlimit;
dquot609fs/dquot.cif (dquot->dq_isoftlimit &&
dquot610fs/dquot.cdquot->dq_curinodes < dquot->dq_isoftlimit &&
dquot611fs/dquot.cdq_dqblk.dqb_curinodes >= dquot->dq_isoftlimit)
dquot612fs/dquot.cdquot->dq_itime = CURRENT_TIME + dquot->dq_mnt->mnt_iexp[type];
dquot613fs/dquot.cdquot->dq_curinodes = dq_dqblk.dqb_curinodes;
dquot614fs/dquot.cif (dquot->dq_curinodes < dquot->dq_isoftlimit)
dquot615fs/dquot.cdquot->dq_flags &= ~DQ_INODES;
dquot616fs/dquot.cif (dquot->dq_bsoftlimit &&
dquot617fs/dquot.cdquot->dq_curblocks < dquot->dq_bsoftlimit &&
dquot618fs/dquot.cdq_dqblk.dqb_curblocks >= dquot->dq_bsoftlimit)
dquot619fs/dquot.cdquot->dq_btime = CURRENT_TIME + dquot->dq_mnt->mnt_bexp[type];
dquot620fs/dquot.cdquot->dq_curblocks = dq_dqblk.dqb_curblocks;
dquot621fs/dquot.cif (dquot->dq_curblocks < dquot->dq_bsoftlimit)
dquot622fs/dquot.cdquot->dq_flags &= ~DQ_BLKS;
dquot628fs/dquot.cdquot->dq_mnt->mnt_bexp[type] = dquot->dq_btime = dq_dqblk.dqb_btime;
dquot629fs/dquot.cdquot->dq_mnt->mnt_iexp[type] = dquot->dq_itime = dq_dqblk.dqb_itime;
dquot633fs/dquot.cdquot->dq_flags |= DQ_FAKE;
dquot635fs/dquot.cdquot->dq_flags &= ~DQ_FAKE;
dquot636fs/dquot.cdquot->dq_flags |= DQ_MOD;
dquot637fs/dquot.cunlock_dquot(dquot);
dquot638fs/dquot.cdqput(dquot);
dquot645fs/dquot.cstruct dquot *dquot;
dquot655fs/dquot.cif ((dquot = dqget(dev, id, type)) != NODQUOT) {
dquot656fs/dquot.cmemcpy_tofs(dqblk, (char *)&dquot->dq_dqb, sizeof(struct dqblk));
dquot657fs/dquot.cdqput(dquot);
dquot684fs/dquot.cstruct dquot *tmp;
dquot720fs/dquot.cstruct dquot * tmp;
dquot826fs/dquot.cstruct dquot *transfer_from[MAXQUOTAS];
dquot827fs/dquot.cstruct dquot *transfer_to[MAXQUOTAS];
dquot955fs/dquot.cstruct dquot *dquot;
dquot986fs/dquot.cdquot = dqget(dev, 0, type);
dquot987fs/dquot.cvfsmnt->mnt_iexp[type] = (dquot) ? dquot->dq_itime : MAX_IQ_TIME;
dquot988fs/dquot.cvfsmnt->mnt_bexp[type] = (dquot) ? dquot->dq_btime : MAX_DQ_TIME;
dquot989fs/dquot.cdqput(dquot);
dquot287include/linux/fs.hstruct dquot *i_dquot[MAXQUOTAS];
dquot175include/linux/quota.hstruct dquot *dq_prev;  /* pointer to prev dquot */
dquot176include/linux/quota.hstruct dquot *dq_next;  /* pointer to next dquot */
dquot177include/linux/quota.hstruct dquot *dq_hash_prev;  /* pointer to prev dquot */
dquot178include/linux/quota.hstruct dquot *dq_hash_next;  /* pointer to next dquot */
dquot181include/linux/quota.h#define NODQUOT (struct dquot *)NULL