(no message)
[unix-history] / usr / src / sys / ufs / ffs / ffs_alloc.c
index 16891d1..c8b7518 100644 (file)
@@ -1,4 +1,4 @@
-/*     ffs_alloc.c     2.6     82/06/07        */
+/*     ffs_alloc.c     2.11    82/09/06        */
 
 #include "../h/param.h"
 #include "../h/systm.h"
 
 #include "../h/param.h"
 #include "../h/systm.h"
@@ -9,6 +9,8 @@
 #include "../h/inode.h"
 #include "../h/dir.h"
 #include "../h/user.h"
 #include "../h/inode.h"
 #include "../h/dir.h"
 #include "../h/user.h"
+#include "../h/quota.h"
+#include "../h/kernel.h"
 
 extern u_long          hashalloc();
 extern ino_t           ialloccg();
 
 extern u_long          hashalloc();
 extern ino_t           ialloccg();
@@ -62,6 +64,10 @@ alloc(ip, bpref, size)
            fs->fs_cstotal.cs_nbfree * fs->fs_frag + fs->fs_cstotal.cs_nffree <
              fs->fs_dsize * fs->fs_minfree / 100)
                goto nospace;
            fs->fs_cstotal.cs_nbfree * fs->fs_frag + fs->fs_cstotal.cs_nffree <
              fs->fs_dsize * fs->fs_minfree / 100)
                goto nospace;
+#ifdef QUOTA
+       if (chkdq(ip, (long)((unsigned)size/DEV_BSIZE), 0))
+               return(NULL);
+#endif
        if (bpref >= fs->fs_size)
                bpref = 0;
        if (bpref == 0)
        if (bpref >= fs->fs_size)
                bpref = 0;
        if (bpref == 0)
@@ -116,16 +122,22 @@ realloccg(ip, bprev, bpref, osize, nsize)
                    ip->i_dev, fs->fs_bsize, bprev, fs->fs_fsmnt);
                panic("realloccg: bad bprev");
        }
                    ip->i_dev, fs->fs_bsize, bprev, fs->fs_fsmnt);
                panic("realloccg: bad bprev");
        }
+#ifdef QUOTA
+       if (chkdq(ip, (long)((unsigned)(nsize-osize)/DEV_BSIZE), 0))
+               return(NULL);
+#endif
        cg = dtog(fs, bprev);
        bno = fragextend(ip, cg, (long)bprev, osize, nsize);
        if (bno != 0) {
        cg = dtog(fs, bprev);
        bno = fragextend(ip, cg, (long)bprev, osize, nsize);
        if (bno != 0) {
-               bp = bread(ip->i_dev, fsbtodb(fs, bno), osize);
-               if (bp->b_flags & B_ERROR) {
-                       brelse(bp);
-                       return (NULL);
-               }
-               brealloc(bp, nsize);
-               blkclr(bp->b_un.b_addr + osize, nsize - osize);
+               do {
+                       bp = bread(ip->i_dev, fsbtodb(fs, bno), osize);
+                       if (bp->b_flags & B_ERROR) {
+                               brelse(bp);
+                               return (NULL);
+                       }
+               } while (brealloc(bp, nsize) == 0);
+               bp->b_flags |= B_DONE;
+               bzero(bp->b_un.b_addr + osize, nsize - osize);
                return (bp);
        }
        if (bpref >= fs->fs_size)
                return (bp);
        }
        if (bpref >= fs->fs_size)
@@ -139,7 +151,7 @@ realloccg(ip, bprev, bpref, osize, nsize)
                }
                bp = getblk(ip->i_dev, fsbtodb(fs, bno), nsize);
                bcopy(obp->b_un.b_addr, bp->b_un.b_addr, osize);
                }
                bp = getblk(ip->i_dev, fsbtodb(fs, bno), nsize);
                bcopy(obp->b_un.b_addr, bp->b_un.b_addr, osize);
-               blkclr(bp->b_un.b_addr + osize, nsize - osize);
+               bzero(bp->b_un.b_addr + osize, nsize - osize);
                brelse(obp);
                fre(ip, bprev, (off_t)osize);
                return (bp);
                brelse(obp);
                fre(ip, bprev, (off_t)osize);
                return (bp);
@@ -183,6 +195,10 @@ ialloc(pip, ipref, mode)
        fs = pip->i_fs;
        if (fs->fs_cstotal.cs_nifree == 0)
                goto noinodes;
        fs = pip->i_fs;
        if (fs->fs_cstotal.cs_nifree == 0)
                goto noinodes;
+#ifdef QUOTA
+       if (chkiq(pip->i_dev, NULL, u.u_uid, 0))
+               return(NULL);
+#endif
        if (ipref >= fs->fs_ncg * fs->fs_ipg)
                ipref = 0;
        cg = itog(fs, ipref);
        if (ipref >= fs->fs_ncg * fs->fs_ipg)
                ipref = 0;
        cg = itog(fs, ipref);
@@ -348,7 +364,7 @@ fragextend(ip, cg, bprev, osize, nsize)
                brelse(bp);
                return (NULL);
        }
                brelse(bp);
                return (NULL);
        }
-       cgp->cg_time = time;
+       cgp->cg_time = time.tv_sec;
        bno = dtogd(fs, bprev);
        for (i = numfrags(fs, osize); i < frags; i++)
                if (isclr(cgp->cg_free, bno + i)) {
        bno = dtogd(fs, bprev);
        for (i = numfrags(fs, osize); i < frags; i++)
                if (isclr(cgp->cg_free, bno + i)) {
@@ -407,7 +423,7 @@ alloccg(ip, cg, bpref, size)
                brelse(bp);
                return (NULL);
        }
                brelse(bp);
                return (NULL);
        }
-       cgp->cg_time = time;
+       cgp->cg_time = time.tv_sec;
        if (size == fs->fs_bsize) {
                bno = alloccgblk(fs, cgp, bpref);
                bdwrite(bp);
        if (size == fs->fs_bsize) {
                bno = alloccgblk(fs, cgp, bpref);
                bdwrite(bp);
@@ -489,10 +505,14 @@ alloccgblk(fs, cgp, bpref)
        /*
         * if the requested block is available, use it
         */
        /*
         * if the requested block is available, use it
         */
+/*
+ * disallow sequential layout.
+ *
        if (isblock(fs, cgp->cg_free, bpref/fs->fs_frag)) {
                bno = bpref;
                goto gotit;
        }
        if (isblock(fs, cgp->cg_free, bpref/fs->fs_frag)) {
                bno = bpref;
                goto gotit;
        }
+ */
        /*
         * check for a block available on the same cylinder
         */
        /*
         * check for a block available on the same cylinder
         */
@@ -613,7 +633,7 @@ ialloccg(ip, cg, ipref, mode)
                brelse(bp);
                return (NULL);
        }
                brelse(bp);
                return (NULL);
        }
-       cgp->cg_time = time;
+       cgp->cg_time = time.tv_sec;
        if (ipref) {
                ipref %= fs->fs_ipg;
                if (isclr(cgp->cg_iused, ipref))
        if (ipref) {
                ipref %= fs->fs_ipg;
                if (isclr(cgp->cg_iused, ipref))
@@ -681,7 +701,7 @@ fre(ip, bno, size)
                brelse(bp);
                return;
        }
                brelse(bp);
                return;
        }
-       cgp->cg_time = time;
+       cgp->cg_time = time.tv_sec;
        bno = dtogd(fs, bno);
        if (size == fs->fs_bsize) {
                if (isblock(fs, cgp->cg_free, bno/fs->fs_frag)) {
        bno = dtogd(fs, bno);
        if (size == fs->fs_bsize) {
                if (isblock(fs, cgp->cg_free, bno/fs->fs_frag)) {
@@ -770,7 +790,7 @@ ifree(ip, ino, mode)
                brelse(bp);
                return;
        }
                brelse(bp);
                return;
        }
-       cgp->cg_time = time;
+       cgp->cg_time = time.tv_sec;
        ino %= fs->fs_ipg;
        if (isclr(cgp->cg_iused, ino)) {
                printf("dev = 0x%x, ino = %d, fs = %s\n",
        ino %= fs->fs_ipg;
        if (isclr(cgp->cg_iused, ino)) {
                printf("dev = 0x%x, ino = %d, fs = %s\n",
@@ -1002,27 +1022,13 @@ update(flag)
                fs = mp->m_bufp->b_un.b_fs;
                if (fs->fs_fmod == 0)
                        continue;
                fs = mp->m_bufp->b_un.b_fs;
                if (fs->fs_fmod == 0)
                        continue;
-               if (fs->fs_ronly != 0) {
+               if (fs->fs_ronly != 0) {                /* ### */
                        printf("fs = %s\n", fs->fs_fsmnt);
                        panic("update: rofs mod");
                }
                        printf("fs = %s\n", fs->fs_fsmnt);
                        panic("update: rofs mod");
                }
-               bp = getblk(mp->m_dev, SBLOCK, SBSIZE);
-               if (bp->b_un.b_fs != fs || fs->fs_magic != FS_MAGIC) {
-                       printf("fs = %s\n", fs->fs_fsmnt);
-                       panic("update: bad b_fs");
-               }
                fs->fs_fmod = 0;
                fs->fs_fmod = 0;
-               fs->fs_time = time;
-               bwrite(bp);
-               blks = howmany(fs->fs_cssize, fs->fs_fsize);
-               for (i = 0; i < blks; i += fs->fs_frag) {
-                       bp = getblk(mp->m_dev,
-                           fsbtodb(fs, fs->fs_csaddr + i),
-                           blks - i < fs->fs_frag ? 
-                               (blks - i) * fs->fs_fsize :
-                               fs->fs_bsize);
-                       bwrite(bp);
-               }
+               fs->fs_time = time.tv_sec;
+               sbupdate(mp);
        }
        /*
         * Write back each (modified) inode.
        }
        /*
         * Write back each (modified) inode.
@@ -1032,7 +1038,7 @@ update(flag)
                        continue;
                ip->i_flag |= ILOCK;
                ip->i_count++;
                        continue;
                ip->i_flag |= ILOCK;
                ip->i_count++;
-               iupdat(ip, &time, &time, 0);
+               iupdat(ip, &time.tv_sec, &time.tv_sec, 0);
                iput(ip);
        }
        updlock = 0;
                iput(ip);
        }
        updlock = 0;