Module Name: src Committed By: dholland Date: Mon Feb 13 06:23:41 UTC 2012
Modified Files: src/sys/ufs/ufs: ufs_quota2.c Log Message: Fix another problem with quota cursor iteration. ok riz To generate a diff of this commit: cvs rdiff -u -r1.33 -r1.34 src/sys/ufs/ufs/ufs_quota2.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/ufs/ufs/ufs_quota2.c diff -u src/sys/ufs/ufs/ufs_quota2.c:1.33 src/sys/ufs/ufs/ufs_quota2.c:1.34 --- src/sys/ufs/ufs/ufs_quota2.c:1.33 Sun Feb 5 14:19:04 2012 +++ src/sys/ufs/ufs/ufs_quota2.c Mon Feb 13 06:23:41 2012 @@ -1,4 +1,4 @@ -/* $NetBSD: ufs_quota2.c,v 1.33 2012/02/05 14:19:04 dholland Exp $ */ +/* $NetBSD: ufs_quota2.c,v 1.34 2012/02/13 06:23:41 dholland Exp $ */ /*- * Copyright (c) 2010 Manuel Bouyer * All rights reserved. @@ -26,7 +26,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: ufs_quota2.c,v 1.33 2012/02/05 14:19:04 dholland Exp $"); +__KERNEL_RCSID(0, "$NetBSD: ufs_quota2.c,v 1.34 2012/02/13 06:23:41 dholland Exp $"); #include <sys/buf.h> #include <sys/param.h> @@ -957,6 +957,7 @@ struct q2cursor_getids { unsigned skip; /* number of ids to skip over */ unsigned new_skip; /* number of ids to skip over next time */ unsigned skipped; /* number skipped so far */ + int stopped; /* true if we stopped quota_walk_list early */ }; /* @@ -1109,6 +1110,7 @@ q2cursor_getids_callback(struct ufsmount gi->new_skip++; if (gi->state->numids >= gi->state->maxids) { /* got enough ids, stop now */ + gi->stopped = 1; return Q2WL_ABORT; } return 0; @@ -1175,11 +1177,16 @@ q2cursor_getkeys(struct ufsmount *ump, i gi.skip = cursor->q2c_uidpos; gi.new_skip = gi.skip; gi.skipped = 0; + gi.stopped = 0; offset = q2h->q2h_entries[cursor->q2c_hashpos]; error = quota2_walk_list(ump, hbp, idtype, &offset, 0, &gi, q2cursor_getids_callback); - if (error == Q2WL_ABORT) { + KASSERT(error != Q2WL_ABORT); + if (error) { + break; + } + if (gi.stopped) { /* callback stopped before reading whole chain */ cursor->q2c_uidpos = gi.new_skip; /* if we didn't get both halves, back up */ @@ -1187,10 +1194,6 @@ q2cursor_getkeys(struct ufsmount *ump, i KASSERT(cursor->q2c_uidpos > 0); cursor->q2c_uidpos--; } - /* not an error */ - error = 0; - } else if (error) { - break; } else { /* read whole chain */ /* if we got both halves of the last id, advance */