+ /*
+ * Some devices may not exist til after boot time.
+ * If so, their nblk count will be 0.
+ */
+ if (nblks <= 0) {
+ int perdev;
+ dev_t dev = sp->sw_dev;
+
+ if (bdevsw[major(dev)].d_psize == 0 ||
+ (nblks = (*bdevsw[major(dev)].d_psize)(dev)) == -1) {
+ (void) VOP_CLOSE(vp, FREAD|FWRITE, p->p_ucred, p);
+ sp->sw_flags &= ~SW_FREED;
+ return (ENXIO);
+ }
+#ifdef SEQSWAP
+ if (index < niswdev) {
+ perdev = niswap / niswdev;
+ if (nblks > perdev)
+ nblks = perdev;
+ } else {
+ if (nblks % dmmax)
+ nblks -= (nblks % dmmax);
+ nswap += nblks;
+ }
+#else
+ perdev = nswap / nswdev;
+ if (nblks > perdev)
+ nblks = perdev;
+#endif
+ sp->sw_nblks = nblks;
+ }
+ if (nblks == 0) {
+ (void) VOP_CLOSE(vp, FREAD|FWRITE, p->p_ucred, p);
+ sp->sw_flags &= ~SW_FREED;
+ return (0); /* XXX error? */
+ }
+#ifdef SEQSWAP
+ if (sp->sw_flags & SW_SEQUENTIAL) {
+ register struct swdevt *swp;
+
+ blk = niswap;
+ for (swp = &swdevt[niswdev]; swp != sp; swp++)
+ blk += swp->sw_nblks;
+ rmfree(swapmap, nblks, blk);
+ return (0);
+ }
+#endif