linux/fs/ufs/ialloc.c
<<
>>
Prefs
   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 */
  57void 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 = cpu_to_fs32(sb, get_seconds());
  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 */
 129static 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 */
 172struct 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
 238cg_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
 343fail_remove_inode:
 344        mutex_unlock(&sbi->s_lock);
 345        clear_nlink(inode);
 346        unlock_new_inode(inode);
 347        iput(inode);
 348        UFSD("EXIT (FAILED): err %d\n", err);
 349        return ERR_PTR(err);
 350failed:
 351        mutex_unlock(&sbi->s_lock);
 352        make_bad_inode(inode);
 353        iput (inode);
 354        UFSD("EXIT (FAILED): err %d\n", err);
 355        return ERR_PTR(err);
 356}
 357