root/fs/ufs/ialloc.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. ufs_free_inode
  2. ufs2_init_inodes_chunk
  3. ufs_new_inode

   1 // SPDX-License-Identifier: GPL-2.0
   2 /*
   3  *  linux/fs/ufs/ialloc.c
   4  *
   5  * Copyright (c) 1998
   6  * Daniel Pirkl <daniel.pirkl@email.cz>
   7  * Charles University, Faculty of Mathematics and Physics
   8  *
   9  *  from
  10  *
  11  *  linux/fs/ext2/ialloc.c
  12  *
  13  * Copyright (C) 1992, 1993, 1994, 1995
  14  * Remy Card (card@masi.ibp.fr)
  15  * Laboratoire MASI - Institut Blaise Pascal
  16  * Universite Pierre et Marie Curie (Paris VI)
  17  *
  18  *  BSD ufs-inspired inode and directory allocation by 
  19  *  Stephen Tweedie (sct@dcs.ed.ac.uk), 1993
  20  *  Big-endian to little-endian byte-swapping/bitmaps by
  21  *        David S. Miller (davem@caip.rutgers.edu), 1995
  22  *
  23  * UFS2 write support added by
  24  * Evgeniy Dushistov <dushistov@mail.ru>, 2007
  25  */
  26 
  27 #include <linux/fs.h>
  28 #include <linux/time.h>
  29 #include <linux/stat.h>
  30 #include <linux/string.h>
  31 #include <linux/buffer_head.h>
  32 #include <linux/sched.h>
  33 #include <linux/bitops.h>
  34 #include <asm/byteorder.h>
  35 
  36 #include "ufs_fs.h"
  37 #include "ufs.h"
  38 #include "swab.h"
  39 #include "util.h"
  40 
  41 /*
  42  * NOTE! When we get the inode, we're the only people
  43  * that have access to it, and as such there are no
  44  * race conditions we have to worry about. The inode
  45  * is not on the hash-lists, and it cannot be reached
  46  * through the filesystem because the directory entry
  47  * has been deleted earlier.
  48  *
  49  * HOWEVER: we must make sure that we get no aliases,
  50  * which means that we have to call "clear_inode()"
  51  * _before_ we mark the inode not in use in the inode
  52  * bitmaps. Otherwise a newly created file might use
  53  * the same inode number (not actually the same pointer
  54  * though), and then we'd have two inodes sharing the
  55  * same inode number and space on the harddisk.
  56  */
  57 void ufs_free_inode (struct inode * inode)
  58 {
  59         struct super_block * sb;
  60         struct ufs_sb_private_info * uspi;
  61         struct ufs_cg_private_info * ucpi;
  62         struct ufs_cylinder_group * ucg;
  63         int is_directory;
  64         unsigned ino, cg, bit;
  65         
  66         UFSD("ENTER, ino %lu\n", inode->i_ino);
  67 
  68         sb = inode->i_sb;
  69         uspi = UFS_SB(sb)->s_uspi;
  70         
  71         ino = inode->i_ino;
  72 
  73         mutex_lock(&UFS_SB(sb)->s_lock);
  74 
  75         if (!((ino > 1) && (ino < (uspi->s_ncg * uspi->s_ipg )))) {
  76                 ufs_warning(sb, "ufs_free_inode", "reserved inode or nonexistent inode %u\n", ino);
  77                 mutex_unlock(&UFS_SB(sb)->s_lock);
  78                 return;
  79         }
  80         
  81         cg = ufs_inotocg (ino);
  82         bit = ufs_inotocgoff (ino);
  83         ucpi = ufs_load_cylinder (sb, cg);
  84         if (!ucpi) {
  85                 mutex_unlock(&UFS_SB(sb)->s_lock);
  86                 return;
  87         }
  88         ucg = ubh_get_ucg(UCPI_UBH(ucpi));
  89         if (!ufs_cg_chkmagic(sb, ucg))
  90                 ufs_panic (sb, "ufs_free_fragments", "internal error, bad cg magic number");
  91 
  92         ucg->cg_time = ufs_get_seconds(sb);
  93 
  94         is_directory = S_ISDIR(inode->i_mode);
  95 
  96         if (ubh_isclr (UCPI_UBH(ucpi), ucpi->c_iusedoff, bit))
  97                 ufs_error(sb, "ufs_free_inode", "bit already cleared for inode %u", ino);
  98         else {
  99                 ubh_clrbit (UCPI_UBH(ucpi), ucpi->c_iusedoff, bit);
 100                 if (ino < ucpi->c_irotor)
 101                         ucpi->c_irotor = ino;
 102                 fs32_add(sb, &ucg->cg_cs.cs_nifree, 1);
 103                 uspi->cs_total.cs_nifree++;
 104                 fs32_add(sb, &UFS_SB(sb)->fs_cs(cg).cs_nifree, 1);
 105 
 106                 if (is_directory) {
 107                         fs32_sub(sb, &ucg->cg_cs.cs_ndir, 1);
 108                         uspi->cs_total.cs_ndir--;
 109                         fs32_sub(sb, &UFS_SB(sb)->fs_cs(cg).cs_ndir, 1);
 110                 }
 111         }
 112 
 113         ubh_mark_buffer_dirty (USPI_UBH(uspi));
 114         ubh_mark_buffer_dirty (UCPI_UBH(ucpi));
 115         if (sb->s_flags & SB_SYNCHRONOUS)
 116                 ubh_sync_block(UCPI_UBH(ucpi));
 117         
 118         ufs_mark_sb_dirty(sb);
 119         mutex_unlock(&UFS_SB(sb)->s_lock);
 120         UFSD("EXIT\n");
 121 }
 122 
 123 /*
 124  * Nullify new chunk of inodes,
 125  * BSD people also set ui_gen field of inode
 126  * during nullification, but we not care about
 127  * that because of linux ufs do not support NFS
 128  */
 129 static void ufs2_init_inodes_chunk(struct super_block *sb,
 130                                    struct ufs_cg_private_info *ucpi,
 131                                    struct ufs_cylinder_group *ucg)
 132 {
 133         struct buffer_head *bh;
 134         struct ufs_sb_private_info *uspi = UFS_SB(sb)->s_uspi;
 135         sector_t beg = uspi->s_sbbase +
 136                 ufs_inotofsba(ucpi->c_cgx * uspi->s_ipg +
 137                               fs32_to_cpu(sb, ucg->cg_u.cg_u2.cg_initediblk));
 138         sector_t end = beg + uspi->s_fpb;
 139 
 140         UFSD("ENTER cgno %d\n", ucpi->c_cgx);
 141 
 142         for (; beg < end; ++beg) {
 143                 bh = sb_getblk(sb, beg);
 144                 lock_buffer(bh);
 145                 memset(bh->b_data, 0, sb->s_blocksize);
 146                 set_buffer_uptodate(bh);
 147                 mark_buffer_dirty(bh);
 148                 unlock_buffer(bh);
 149                 if (sb->s_flags & SB_SYNCHRONOUS)
 150                         sync_dirty_buffer(bh);
 151                 brelse(bh);
 152         }
 153 
 154         fs32_add(sb, &ucg->cg_u.cg_u2.cg_initediblk, uspi->s_inopb);
 155         ubh_mark_buffer_dirty(UCPI_UBH(ucpi));
 156         if (sb->s_flags & SB_SYNCHRONOUS)
 157                 ubh_sync_block(UCPI_UBH(ucpi));
 158 
 159         UFSD("EXIT\n");
 160 }
 161 
 162 /*
 163  * There are two policies for allocating an inode.  If the new inode is
 164  * a directory, then a forward search is made for a block group with both
 165  * free space and a low directory-to-inode ratio; if that fails, then of
 166  * the groups with above-average free space, that group with the fewest
 167  * directories already is chosen.
 168  *
 169  * For other inodes, search forward from the parent directory's block
 170  * group to find a free inode.
 171  */
 172 struct inode *ufs_new_inode(struct inode *dir, umode_t mode)
 173 {
 174         struct super_block * sb;
 175         struct ufs_sb_info * sbi;
 176         struct ufs_sb_private_info * uspi;
 177         struct ufs_cg_private_info * ucpi;
 178         struct ufs_cylinder_group * ucg;
 179         struct inode * inode;
 180         struct timespec64 ts;
 181         unsigned cg, bit, i, j, start;
 182         struct ufs_inode_info *ufsi;
 183         int err = -ENOSPC;
 184 
 185         UFSD("ENTER\n");
 186         
 187         /* Cannot create files in a deleted directory */
 188         if (!dir || !dir->i_nlink)
 189                 return ERR_PTR(-EPERM);
 190         sb = dir->i_sb;
 191         inode = new_inode(sb);
 192         if (!inode)
 193                 return ERR_PTR(-ENOMEM);
 194         ufsi = UFS_I(inode);
 195         sbi = UFS_SB(sb);
 196         uspi = sbi->s_uspi;
 197 
 198         mutex_lock(&sbi->s_lock);
 199 
 200         /*
 201          * Try to place the inode in its parent directory
 202          */
 203         i = ufs_inotocg(dir->i_ino);
 204         if (sbi->fs_cs(i).cs_nifree) {
 205                 cg = i;
 206                 goto cg_found;
 207         }
 208 
 209         /*
 210          * Use a quadratic hash to find a group with a free inode
 211          */
 212         for ( j = 1; j < uspi->s_ncg; j <<= 1 ) {
 213                 i += j;
 214                 if (i >= uspi->s_ncg)
 215                         i -= uspi->s_ncg;
 216                 if (sbi->fs_cs(i).cs_nifree) {
 217                         cg = i;
 218                         goto cg_found;
 219                 }
 220         }
 221 
 222         /*
 223          * That failed: try linear search for a free inode
 224          */
 225         i = ufs_inotocg(dir->i_ino) + 1;
 226         for (j = 2; j < uspi->s_ncg; j++) {
 227                 i++;
 228                 if (i >= uspi->s_ncg)
 229                         i = 0;
 230                 if (sbi->fs_cs(i).cs_nifree) {
 231                         cg = i;
 232                         goto cg_found;
 233                 }
 234         }
 235 
 236         goto failed;
 237 
 238 cg_found:
 239         ucpi = ufs_load_cylinder (sb, cg);
 240         if (!ucpi) {
 241                 err = -EIO;
 242                 goto failed;
 243         }
 244         ucg = ubh_get_ucg(UCPI_UBH(ucpi));
 245         if (!ufs_cg_chkmagic(sb, ucg)) 
 246                 ufs_panic (sb, "ufs_new_inode", "internal error, bad cg magic number");
 247 
 248         start = ucpi->c_irotor;
 249         bit = ubh_find_next_zero_bit (UCPI_UBH(ucpi), ucpi->c_iusedoff, uspi->s_ipg, start);
 250         if (!(bit < uspi->s_ipg)) {
 251                 bit = ubh_find_first_zero_bit (UCPI_UBH(ucpi), ucpi->c_iusedoff, start);
 252                 if (!(bit < start)) {
 253                         ufs_error (sb, "ufs_new_inode",
 254                             "cylinder group %u corrupted - error in inode bitmap\n", cg);
 255                         err = -EIO;
 256                         goto failed;
 257                 }
 258         }
 259         UFSD("start = %u, bit = %u, ipg = %u\n", start, bit, uspi->s_ipg);
 260         if (ubh_isclr (UCPI_UBH(ucpi), ucpi->c_iusedoff, bit))
 261                 ubh_setbit (UCPI_UBH(ucpi), ucpi->c_iusedoff, bit);
 262         else {
 263                 ufs_panic (sb, "ufs_new_inode", "internal error");
 264                 err = -EIO;
 265                 goto failed;
 266         }
 267 
 268         if (uspi->fs_magic == UFS2_MAGIC) {
 269                 u32 initediblk = fs32_to_cpu(sb, ucg->cg_u.cg_u2.cg_initediblk);
 270 
 271                 if (bit + uspi->s_inopb > initediblk &&
 272                     initediblk < fs32_to_cpu(sb, ucg->cg_u.cg_u2.cg_niblk))
 273                         ufs2_init_inodes_chunk(sb, ucpi, ucg);
 274         }
 275 
 276         fs32_sub(sb, &ucg->cg_cs.cs_nifree, 1);
 277         uspi->cs_total.cs_nifree--;
 278         fs32_sub(sb, &sbi->fs_cs(cg).cs_nifree, 1);
 279         
 280         if (S_ISDIR(mode)) {
 281                 fs32_add(sb, &ucg->cg_cs.cs_ndir, 1);
 282                 uspi->cs_total.cs_ndir++;
 283                 fs32_add(sb, &sbi->fs_cs(cg).cs_ndir, 1);
 284         }
 285         ubh_mark_buffer_dirty (USPI_UBH(uspi));
 286         ubh_mark_buffer_dirty (UCPI_UBH(ucpi));
 287         if (sb->s_flags & SB_SYNCHRONOUS)
 288                 ubh_sync_block(UCPI_UBH(ucpi));
 289         ufs_mark_sb_dirty(sb);
 290 
 291         inode->i_ino = cg * uspi->s_ipg + bit;
 292         inode_init_owner(inode, dir, mode);
 293         inode->i_blocks = 0;
 294         inode->i_generation = 0;
 295         inode->i_mtime = inode->i_atime = inode->i_ctime = current_time(inode);
 296         ufsi->i_flags = UFS_I(dir)->i_flags;
 297         ufsi->i_lastfrag = 0;
 298         ufsi->i_shadow = 0;
 299         ufsi->i_osync = 0;
 300         ufsi->i_oeftflag = 0;
 301         ufsi->i_dir_start_lookup = 0;
 302         memset(&ufsi->i_u1, 0, sizeof(ufsi->i_u1));
 303         if (insert_inode_locked(inode) < 0) {
 304                 err = -EIO;
 305                 goto failed;
 306         }
 307         mark_inode_dirty(inode);
 308 
 309         if (uspi->fs_magic == UFS2_MAGIC) {
 310                 struct buffer_head *bh;
 311                 struct ufs2_inode *ufs2_inode;
 312 
 313                 /*
 314                  * setup birth date, we do it here because of there is no sense
 315                  * to hold it in struct ufs_inode_info, and lose 64 bit
 316                  */
 317                 bh = sb_bread(sb, uspi->s_sbbase + ufs_inotofsba(inode->i_ino));
 318                 if (!bh) {
 319                         ufs_warning(sb, "ufs_read_inode",
 320                                     "unable to read inode %lu\n",
 321                                     inode->i_ino);
 322                         err = -EIO;
 323                         goto fail_remove_inode;
 324                 }
 325                 lock_buffer(bh);
 326                 ufs2_inode = (struct ufs2_inode *)bh->b_data;
 327                 ufs2_inode += ufs_inotofsbo(inode->i_ino);
 328                 ktime_get_real_ts64(&ts);
 329                 ufs2_inode->ui_birthtime = cpu_to_fs64(sb, ts.tv_sec);
 330                 ufs2_inode->ui_birthnsec = cpu_to_fs32(sb, ts.tv_nsec);
 331                 mark_buffer_dirty(bh);
 332                 unlock_buffer(bh);
 333                 if (sb->s_flags & SB_SYNCHRONOUS)
 334                         sync_dirty_buffer(bh);
 335                 brelse(bh);
 336         }
 337         mutex_unlock(&sbi->s_lock);
 338 
 339         UFSD("allocating inode %lu\n", inode->i_ino);
 340         UFSD("EXIT\n");
 341         return inode;
 342 
 343 fail_remove_inode:
 344         mutex_unlock(&sbi->s_lock);
 345         clear_nlink(inode);
 346         discard_new_inode(inode);
 347         UFSD("EXIT (FAILED): err %d\n", err);
 348         return ERR_PTR(err);
 349 failed:
 350         mutex_unlock(&sbi->s_lock);
 351         make_bad_inode(inode);
 352         iput (inode);
 353         UFSD("EXIT (FAILED): err %d\n", err);
 354         return ERR_PTR(err);
 355 }

/* [<][>][^][v][top][bottom][index][help] */