linux/fs/jffs2/dir.c
<<
>>
Prefs
   1/*
   2 * JFFS2 -- Journalling Flash File System, Version 2.
   3 *
   4 * Copyright © 2001-2007 Red Hat, Inc.
   5 * Copyright © 2004-2010 David Woodhouse <dwmw2@infradead.org>
   6 *
   7 * Created by David Woodhouse <dwmw2@infradead.org>
   8 *
   9 * For licensing information, see the file 'LICENCE' in this directory.
  10 *
  11 */
  12
  13#include <linux/kernel.h>
  14#include <linux/slab.h>
  15#include <linux/fs.h>
  16#include <linux/crc32.h>
  17#include <linux/jffs2.h>
  18#include "jffs2_fs_i.h"
  19#include "jffs2_fs_sb.h"
  20#include <linux/time.h>
  21#include "nodelist.h"
  22
  23static int jffs2_readdir (struct file *, void *, filldir_t);
  24
  25static int jffs2_create (struct inode *,struct dentry *,int,
  26                         struct nameidata *);
  27static struct dentry *jffs2_lookup (struct inode *,struct dentry *,
  28                                    struct nameidata *);
  29static int jffs2_link (struct dentry *,struct inode *,struct dentry *);
  30static int jffs2_unlink (struct inode *,struct dentry *);
  31static int jffs2_symlink (struct inode *,struct dentry *,const char *);
  32static int jffs2_mkdir (struct inode *,struct dentry *,int);
  33static int jffs2_rmdir (struct inode *,struct dentry *);
  34static int jffs2_mknod (struct inode *,struct dentry *,int,dev_t);
  35static int jffs2_rename (struct inode *, struct dentry *,
  36                         struct inode *, struct dentry *);
  37
  38const struct file_operations jffs2_dir_operations =
  39{
  40        .read =         generic_read_dir,
  41        .readdir =      jffs2_readdir,
  42        .unlocked_ioctl=jffs2_ioctl,
  43        .fsync =        jffs2_fsync,
  44        .llseek =       generic_file_llseek,
  45};
  46
  47
  48const struct inode_operations jffs2_dir_inode_operations =
  49{
  50        .create =       jffs2_create,
  51        .lookup =       jffs2_lookup,
  52        .link =         jffs2_link,
  53        .unlink =       jffs2_unlink,
  54        .symlink =      jffs2_symlink,
  55        .mkdir =        jffs2_mkdir,
  56        .rmdir =        jffs2_rmdir,
  57        .mknod =        jffs2_mknod,
  58        .rename =       jffs2_rename,
  59        .check_acl =    jffs2_check_acl,
  60        .setattr =      jffs2_setattr,
  61        .setxattr =     jffs2_setxattr,
  62        .getxattr =     jffs2_getxattr,
  63        .listxattr =    jffs2_listxattr,
  64        .removexattr =  jffs2_removexattr
  65};
  66
  67/***********************************************************************/
  68
  69
  70/* We keep the dirent list sorted in increasing order of name hash,
  71   and we use the same hash function as the dentries. Makes this
  72   nice and simple
  73*/
  74static struct dentry *jffs2_lookup(struct inode *dir_i, struct dentry *target,
  75                                   struct nameidata *nd)
  76{
  77        struct jffs2_inode_info *dir_f;
  78        struct jffs2_sb_info *c;
  79        struct jffs2_full_dirent *fd = NULL, *fd_list;
  80        uint32_t ino = 0;
  81        struct inode *inode = NULL;
  82
  83        D1(printk(KERN_DEBUG "jffs2_lookup()\n"));
  84
  85        if (target->d_name.len > JFFS2_MAX_NAME_LEN)
  86                return ERR_PTR(-ENAMETOOLONG);
  87
  88        dir_f = JFFS2_INODE_INFO(dir_i);
  89        c = JFFS2_SB_INFO(dir_i->i_sb);
  90
  91        mutex_lock(&dir_f->sem);
  92
  93        /* NB: The 2.2 backport will need to explicitly check for '.' and '..' here */
  94        for (fd_list = dir_f->dents; fd_list && fd_list->nhash <= target->d_name.hash; fd_list = fd_list->next) {
  95                if (fd_list->nhash == target->d_name.hash &&
  96                    (!fd || fd_list->version > fd->version) &&
  97                    strlen(fd_list->name) == target->d_name.len &&
  98                    !strncmp(fd_list->name, target->d_name.name, target->d_name.len)) {
  99                        fd = fd_list;
 100                }
 101        }
 102        if (fd)
 103                ino = fd->ino;
 104        mutex_unlock(&dir_f->sem);
 105        if (ino) {
 106                inode = jffs2_iget(dir_i->i_sb, ino);
 107                if (IS_ERR(inode)) {
 108                        printk(KERN_WARNING "iget() failed for ino #%u\n", ino);
 109                        return ERR_CAST(inode);
 110                }
 111        }
 112
 113        return d_splice_alias(inode, target);
 114}
 115
 116/***********************************************************************/
 117
 118
 119static int jffs2_readdir(struct file *filp, void *dirent, filldir_t filldir)
 120{
 121        struct jffs2_inode_info *f;
 122        struct jffs2_sb_info *c;
 123        struct inode *inode = filp->f_path.dentry->d_inode;
 124        struct jffs2_full_dirent *fd;
 125        unsigned long offset, curofs;
 126
 127        D1(printk(KERN_DEBUG "jffs2_readdir() for dir_i #%lu\n", filp->f_path.dentry->d_inode->i_ino));
 128
 129        f = JFFS2_INODE_INFO(inode);
 130        c = JFFS2_SB_INFO(inode->i_sb);
 131
 132        offset = filp->f_pos;
 133
 134        if (offset == 0) {
 135                D1(printk(KERN_DEBUG "Dirent 0: \".\", ino #%lu\n", inode->i_ino));
 136                if (filldir(dirent, ".", 1, 0, inode->i_ino, DT_DIR) < 0)
 137                        goto out;
 138                offset++;
 139        }
 140        if (offset == 1) {
 141                unsigned long pino = parent_ino(filp->f_path.dentry);
 142                D1(printk(KERN_DEBUG "Dirent 1: \"..\", ino #%lu\n", pino));
 143                if (filldir(dirent, "..", 2, 1, pino, DT_DIR) < 0)
 144                        goto out;
 145                offset++;
 146        }
 147
 148        curofs=1;
 149        mutex_lock(&f->sem);
 150        for (fd = f->dents; fd; fd = fd->next) {
 151
 152                curofs++;
 153                /* First loop: curofs = 2; offset = 2 */
 154                if (curofs < offset) {
 155                        D2(printk(KERN_DEBUG "Skipping dirent: \"%s\", ino #%u, type %d, because curofs %ld < offset %ld\n",
 156                                  fd->name, fd->ino, fd->type, curofs, offset));
 157                        continue;
 158                }
 159                if (!fd->ino) {
 160                        D2(printk(KERN_DEBUG "Skipping deletion dirent \"%s\"\n", fd->name));
 161                        offset++;
 162                        continue;
 163                }
 164                D2(printk(KERN_DEBUG "Dirent %ld: \"%s\", ino #%u, type %d\n", offset, fd->name, fd->ino, fd->type));
 165                if (filldir(dirent, fd->name, strlen(fd->name), offset, fd->ino, fd->type) < 0)
 166                        break;
 167                offset++;
 168        }
 169        mutex_unlock(&f->sem);
 170 out:
 171        filp->f_pos = offset;
 172        return 0;
 173}
 174
 175/***********************************************************************/
 176
 177
 178static int jffs2_create(struct inode *dir_i, struct dentry *dentry, int mode,
 179                        struct nameidata *nd)
 180{
 181        struct jffs2_raw_inode *ri;
 182        struct jffs2_inode_info *f, *dir_f;
 183        struct jffs2_sb_info *c;
 184        struct inode *inode;
 185        int ret;
 186
 187        ri = jffs2_alloc_raw_inode();
 188        if (!ri)
 189                return -ENOMEM;
 190
 191        c = JFFS2_SB_INFO(dir_i->i_sb);
 192
 193        D1(printk(KERN_DEBUG "jffs2_create()\n"));
 194
 195        inode = jffs2_new_inode(dir_i, mode, ri);
 196
 197        if (IS_ERR(inode)) {
 198                D1(printk(KERN_DEBUG "jffs2_new_inode() failed\n"));
 199                jffs2_free_raw_inode(ri);
 200                return PTR_ERR(inode);
 201        }
 202
 203        inode->i_op = &jffs2_file_inode_operations;
 204        inode->i_fop = &jffs2_file_operations;
 205        inode->i_mapping->a_ops = &jffs2_file_address_operations;
 206        inode->i_mapping->nrpages = 0;
 207
 208        f = JFFS2_INODE_INFO(inode);
 209        dir_f = JFFS2_INODE_INFO(dir_i);
 210
 211        /* jffs2_do_create() will want to lock it, _after_ reserving
 212           space and taking c-alloc_sem. If we keep it locked here,
 213           lockdep gets unhappy (although it's a false positive;
 214           nothing else will be looking at this inode yet so there's
 215           no chance of AB-BA deadlock involving its f->sem). */
 216        mutex_unlock(&f->sem);
 217
 218        ret = jffs2_do_create(c, dir_f, f, ri,
 219                              dentry->d_name.name, dentry->d_name.len);
 220        if (ret)
 221                goto fail;
 222
 223        dir_i->i_mtime = dir_i->i_ctime = ITIME(je32_to_cpu(ri->ctime));
 224
 225        jffs2_free_raw_inode(ri);
 226
 227        D1(printk(KERN_DEBUG "jffs2_create: Created ino #%lu with mode %o, nlink %d(%d). nrpages %ld\n",
 228                  inode->i_ino, inode->i_mode, inode->i_nlink,
 229                  f->inocache->pino_nlink, inode->i_mapping->nrpages));
 230
 231        d_instantiate(dentry, inode);
 232        unlock_new_inode(inode);
 233        return 0;
 234
 235 fail:
 236        iget_failed(inode);
 237        jffs2_free_raw_inode(ri);
 238        return ret;
 239}
 240
 241/***********************************************************************/
 242
 243
 244static int jffs2_unlink(struct inode *dir_i, struct dentry *dentry)
 245{
 246        struct jffs2_sb_info *c = JFFS2_SB_INFO(dir_i->i_sb);
 247        struct jffs2_inode_info *dir_f = JFFS2_INODE_INFO(dir_i);
 248        struct jffs2_inode_info *dead_f = JFFS2_INODE_INFO(dentry->d_inode);
 249        int ret;
 250        uint32_t now = get_seconds();
 251
 252        ret = jffs2_do_unlink(c, dir_f, dentry->d_name.name,
 253                              dentry->d_name.len, dead_f, now);
 254        if (dead_f->inocache)
 255                dentry->d_inode->i_nlink = dead_f->inocache->pino_nlink;
 256        if (!ret)
 257                dir_i->i_mtime = dir_i->i_ctime = ITIME(now);
 258        return ret;
 259}
 260/***********************************************************************/
 261
 262
 263static int jffs2_link (struct dentry *old_dentry, struct inode *dir_i, struct dentry *dentry)
 264{
 265        struct jffs2_sb_info *c = JFFS2_SB_INFO(old_dentry->d_inode->i_sb);
 266        struct jffs2_inode_info *f = JFFS2_INODE_INFO(old_dentry->d_inode);
 267        struct jffs2_inode_info *dir_f = JFFS2_INODE_INFO(dir_i);
 268        int ret;
 269        uint8_t type;
 270        uint32_t now;
 271
 272        /* Don't let people make hard links to bad inodes. */
 273        if (!f->inocache)
 274                return -EIO;
 275
 276        if (S_ISDIR(old_dentry->d_inode->i_mode))
 277                return -EPERM;
 278
 279        /* XXX: This is ugly */
 280        type = (old_dentry->d_inode->i_mode & S_IFMT) >> 12;
 281        if (!type) type = DT_REG;
 282
 283        now = get_seconds();
 284        ret = jffs2_do_link(c, dir_f, f->inocache->ino, type, dentry->d_name.name, dentry->d_name.len, now);
 285
 286        if (!ret) {
 287                mutex_lock(&f->sem);
 288                old_dentry->d_inode->i_nlink = ++f->inocache->pino_nlink;
 289                mutex_unlock(&f->sem);
 290                d_instantiate(dentry, old_dentry->d_inode);
 291                dir_i->i_mtime = dir_i->i_ctime = ITIME(now);
 292                ihold(old_dentry->d_inode);
 293        }
 294        return ret;
 295}
 296
 297/***********************************************************************/
 298
 299static int jffs2_symlink (struct inode *dir_i, struct dentry *dentry, const char *target)
 300{
 301        struct jffs2_inode_info *f, *dir_f;
 302        struct jffs2_sb_info *c;
 303        struct inode *inode;
 304        struct jffs2_raw_inode *ri;
 305        struct jffs2_raw_dirent *rd;
 306        struct jffs2_full_dnode *fn;
 307        struct jffs2_full_dirent *fd;
 308        int namelen;
 309        uint32_t alloclen;
 310        int ret, targetlen = strlen(target);
 311
 312        /* FIXME: If you care. We'd need to use frags for the target
 313           if it grows much more than this */
 314        if (targetlen > 254)
 315                return -ENAMETOOLONG;
 316
 317        ri = jffs2_alloc_raw_inode();
 318
 319        if (!ri)
 320                return -ENOMEM;
 321
 322        c = JFFS2_SB_INFO(dir_i->i_sb);
 323
 324        /* Try to reserve enough space for both node and dirent.
 325         * Just the node will do for now, though
 326         */
 327        namelen = dentry->d_name.len;
 328        ret = jffs2_reserve_space(c, sizeof(*ri) + targetlen, &alloclen,
 329                                  ALLOC_NORMAL, JFFS2_SUMMARY_INODE_SIZE);
 330
 331        if (ret) {
 332                jffs2_free_raw_inode(ri);
 333                return ret;
 334        }
 335
 336        inode = jffs2_new_inode(dir_i, S_IFLNK | S_IRWXUGO, ri);
 337
 338        if (IS_ERR(inode)) {
 339                jffs2_free_raw_inode(ri);
 340                jffs2_complete_reservation(c);
 341                return PTR_ERR(inode);
 342        }
 343
 344        inode->i_op = &jffs2_symlink_inode_operations;
 345
 346        f = JFFS2_INODE_INFO(inode);
 347
 348        inode->i_size = targetlen;
 349        ri->isize = ri->dsize = ri->csize = cpu_to_je32(inode->i_size);
 350        ri->totlen = cpu_to_je32(sizeof(*ri) + inode->i_size);
 351        ri->hdr_crc = cpu_to_je32(crc32(0, ri, sizeof(struct jffs2_unknown_node)-4));
 352
 353        ri->compr = JFFS2_COMPR_NONE;
 354        ri->data_crc = cpu_to_je32(crc32(0, target, targetlen));
 355        ri->node_crc = cpu_to_je32(crc32(0, ri, sizeof(*ri)-8));
 356
 357        fn = jffs2_write_dnode(c, f, ri, target, targetlen, ALLOC_NORMAL);
 358
 359        jffs2_free_raw_inode(ri);
 360
 361        if (IS_ERR(fn)) {
 362                /* Eeek. Wave bye bye */
 363                mutex_unlock(&f->sem);
 364                jffs2_complete_reservation(c);
 365                ret = PTR_ERR(fn);
 366                goto fail;
 367        }
 368
 369        /* We use f->target field to store the target path. */
 370        f->target = kmemdup(target, targetlen + 1, GFP_KERNEL);
 371        if (!f->target) {
 372                printk(KERN_WARNING "Can't allocate %d bytes of memory\n", targetlen + 1);
 373                mutex_unlock(&f->sem);
 374                jffs2_complete_reservation(c);
 375                ret = -ENOMEM;
 376                goto fail;
 377        }
 378
 379        D1(printk(KERN_DEBUG "jffs2_symlink: symlink's target '%s' cached\n", (char *)f->target));
 380
 381        /* No data here. Only a metadata node, which will be
 382           obsoleted by the first data write
 383        */
 384        f->metadata = fn;
 385        mutex_unlock(&f->sem);
 386
 387        jffs2_complete_reservation(c);
 388
 389        ret = jffs2_init_security(inode, dir_i);
 390        if (ret)
 391                goto fail;
 392
 393        ret = jffs2_init_acl_post(inode);
 394        if (ret)
 395                goto fail;
 396
 397        ret = jffs2_reserve_space(c, sizeof(*rd)+namelen, &alloclen,
 398                                  ALLOC_NORMAL, JFFS2_SUMMARY_DIRENT_SIZE(namelen));
 399        if (ret)
 400                goto fail;
 401
 402        rd = jffs2_alloc_raw_dirent();
 403        if (!rd) {
 404                /* Argh. Now we treat it like a normal delete */
 405                jffs2_complete_reservation(c);
 406                ret = -ENOMEM;
 407                goto fail;
 408        }
 409
 410        dir_f = JFFS2_INODE_INFO(dir_i);
 411        mutex_lock(&dir_f->sem);
 412
 413        rd->magic = cpu_to_je16(JFFS2_MAGIC_BITMASK);
 414        rd->nodetype = cpu_to_je16(JFFS2_NODETYPE_DIRENT);
 415        rd->totlen = cpu_to_je32(sizeof(*rd) + namelen);
 416        rd->hdr_crc = cpu_to_je32(crc32(0, rd, sizeof(struct jffs2_unknown_node)-4));
 417
 418        rd->pino = cpu_to_je32(dir_i->i_ino);
 419        rd->version = cpu_to_je32(++dir_f->highest_version);
 420        rd->ino = cpu_to_je32(inode->i_ino);
 421        rd->mctime = cpu_to_je32(get_seconds());
 422        rd->nsize = namelen;
 423        rd->type = DT_LNK;
 424        rd->node_crc = cpu_to_je32(crc32(0, rd, sizeof(*rd)-8));
 425        rd->name_crc = cpu_to_je32(crc32(0, dentry->d_name.name, namelen));
 426
 427        fd = jffs2_write_dirent(c, dir_f, rd, dentry->d_name.name, namelen, ALLOC_NORMAL);
 428
 429        if (IS_ERR(fd)) {
 430                /* dirent failed to write. Delete the inode normally
 431                   as if it were the final unlink() */
 432                jffs2_complete_reservation(c);
 433                jffs2_free_raw_dirent(rd);
 434                mutex_unlock(&dir_f->sem);
 435                ret = PTR_ERR(fd);
 436                goto fail;
 437        }
 438
 439        dir_i->i_mtime = dir_i->i_ctime = ITIME(je32_to_cpu(rd->mctime));
 440
 441        jffs2_free_raw_dirent(rd);
 442
 443        /* Link the fd into the inode's list, obsoleting an old
 444           one if necessary. */
 445        jffs2_add_fd_to_list(c, fd, &dir_f->dents);
 446
 447        mutex_unlock(&dir_f->sem);
 448        jffs2_complete_reservation(c);
 449
 450        d_instantiate(dentry, inode);
 451        unlock_new_inode(inode);
 452        return 0;
 453
 454 fail:
 455        iget_failed(inode);
 456        return ret;
 457}
 458
 459
 460static int jffs2_mkdir (struct inode *dir_i, struct dentry *dentry, int mode)
 461{
 462        struct jffs2_inode_info *f, *dir_f;
 463        struct jffs2_sb_info *c;
 464        struct inode *inode;
 465        struct jffs2_raw_inode *ri;
 466        struct jffs2_raw_dirent *rd;
 467        struct jffs2_full_dnode *fn;
 468        struct jffs2_full_dirent *fd;
 469        int namelen;
 470        uint32_t alloclen;
 471        int ret;
 472
 473        mode |= S_IFDIR;
 474
 475        ri = jffs2_alloc_raw_inode();
 476        if (!ri)
 477                return -ENOMEM;
 478
 479        c = JFFS2_SB_INFO(dir_i->i_sb);
 480
 481        /* Try to reserve enough space for both node and dirent.
 482         * Just the node will do for now, though
 483         */
 484        namelen = dentry->d_name.len;
 485        ret = jffs2_reserve_space(c, sizeof(*ri), &alloclen, ALLOC_NORMAL,
 486                                  JFFS2_SUMMARY_INODE_SIZE);
 487
 488        if (ret) {
 489                jffs2_free_raw_inode(ri);
 490                return ret;
 491        }
 492
 493        inode = jffs2_new_inode(dir_i, mode, ri);
 494
 495        if (IS_ERR(inode)) {
 496                jffs2_free_raw_inode(ri);
 497                jffs2_complete_reservation(c);
 498                return PTR_ERR(inode);
 499        }
 500
 501        inode->i_op = &jffs2_dir_inode_operations;
 502        inode->i_fop = &jffs2_dir_operations;
 503
 504        f = JFFS2_INODE_INFO(inode);
 505
 506        /* Directories get nlink 2 at start */
 507        inode->i_nlink = 2;
 508        /* but ic->pino_nlink is the parent ino# */
 509        f->inocache->pino_nlink = dir_i->i_ino;
 510
 511        ri->data_crc = cpu_to_je32(0);
 512        ri->node_crc = cpu_to_je32(crc32(0, ri, sizeof(*ri)-8));
 513
 514        fn = jffs2_write_dnode(c, f, ri, NULL, 0, ALLOC_NORMAL);
 515
 516        jffs2_free_raw_inode(ri);
 517
 518        if (IS_ERR(fn)) {
 519                /* Eeek. Wave bye bye */
 520                mutex_unlock(&f->sem);
 521                jffs2_complete_reservation(c);
 522                ret = PTR_ERR(fn);
 523                goto fail;
 524        }
 525        /* No data here. Only a metadata node, which will be
 526           obsoleted by the first data write
 527        */
 528        f->metadata = fn;
 529        mutex_unlock(&f->sem);
 530
 531        jffs2_complete_reservation(c);
 532
 533        ret = jffs2_init_security(inode, dir_i);
 534        if (ret)
 535                goto fail;
 536
 537        ret = jffs2_init_acl_post(inode);
 538        if (ret)
 539                goto fail;
 540
 541        ret = jffs2_reserve_space(c, sizeof(*rd)+namelen, &alloclen,
 542                                  ALLOC_NORMAL, JFFS2_SUMMARY_DIRENT_SIZE(namelen));
 543        if (ret)
 544                goto fail;
 545
 546        rd = jffs2_alloc_raw_dirent();
 547        if (!rd) {
 548                /* Argh. Now we treat it like a normal delete */
 549                jffs2_complete_reservation(c);
 550                ret = -ENOMEM;
 551                goto fail;
 552        }
 553
 554        dir_f = JFFS2_INODE_INFO(dir_i);
 555        mutex_lock(&dir_f->sem);
 556
 557        rd->magic = cpu_to_je16(JFFS2_MAGIC_BITMASK);
 558        rd->nodetype = cpu_to_je16(JFFS2_NODETYPE_DIRENT);
 559        rd->totlen = cpu_to_je32(sizeof(*rd) + namelen);
 560        rd->hdr_crc = cpu_to_je32(crc32(0, rd, sizeof(struct jffs2_unknown_node)-4));
 561
 562        rd->pino = cpu_to_je32(dir_i->i_ino);
 563        rd->version = cpu_to_je32(++dir_f->highest_version);
 564        rd->ino = cpu_to_je32(inode->i_ino);
 565        rd->mctime = cpu_to_je32(get_seconds());
 566        rd->nsize = namelen;
 567        rd->type = DT_DIR;
 568        rd->node_crc = cpu_to_je32(crc32(0, rd, sizeof(*rd)-8));
 569        rd->name_crc = cpu_to_je32(crc32(0, dentry->d_name.name, namelen));
 570
 571        fd = jffs2_write_dirent(c, dir_f, rd, dentry->d_name.name, namelen, ALLOC_NORMAL);
 572
 573        if (IS_ERR(fd)) {
 574                /* dirent failed to write. Delete the inode normally
 575                   as if it were the final unlink() */
 576                jffs2_complete_reservation(c);
 577                jffs2_free_raw_dirent(rd);
 578                mutex_unlock(&dir_f->sem);
 579                ret = PTR_ERR(fd);
 580                goto fail;
 581        }
 582
 583        dir_i->i_mtime = dir_i->i_ctime = ITIME(je32_to_cpu(rd->mctime));
 584        inc_nlink(dir_i);
 585
 586        jffs2_free_raw_dirent(rd);
 587
 588        /* Link the fd into the inode's list, obsoleting an old
 589           one if necessary. */
 590        jffs2_add_fd_to_list(c, fd, &dir_f->dents);
 591
 592        mutex_unlock(&dir_f->sem);
 593        jffs2_complete_reservation(c);
 594
 595        d_instantiate(dentry, inode);
 596        unlock_new_inode(inode);
 597        return 0;
 598
 599 fail:
 600        iget_failed(inode);
 601        return ret;
 602}
 603
 604static int jffs2_rmdir (struct inode *dir_i, struct dentry *dentry)
 605{
 606        struct jffs2_sb_info *c = JFFS2_SB_INFO(dir_i->i_sb);
 607        struct jffs2_inode_info *dir_f = JFFS2_INODE_INFO(dir_i);
 608        struct jffs2_inode_info *f = JFFS2_INODE_INFO(dentry->d_inode);
 609        struct jffs2_full_dirent *fd;
 610        int ret;
 611        uint32_t now = get_seconds();
 612
 613        for (fd = f->dents ; fd; fd = fd->next) {
 614                if (fd->ino)
 615                        return -ENOTEMPTY;
 616        }
 617
 618        ret = jffs2_do_unlink(c, dir_f, dentry->d_name.name,
 619                              dentry->d_name.len, f, now);
 620        if (!ret) {
 621                dir_i->i_mtime = dir_i->i_ctime = ITIME(now);
 622                clear_nlink(dentry->d_inode);
 623                drop_nlink(dir_i);
 624        }
 625        return ret;
 626}
 627
 628static int jffs2_mknod (struct inode *dir_i, struct dentry *dentry, int mode, dev_t rdev)
 629{
 630        struct jffs2_inode_info *f, *dir_f;
 631        struct jffs2_sb_info *c;
 632        struct inode *inode;
 633        struct jffs2_raw_inode *ri;
 634        struct jffs2_raw_dirent *rd;
 635        struct jffs2_full_dnode *fn;
 636        struct jffs2_full_dirent *fd;
 637        int namelen;
 638        union jffs2_device_node dev;
 639        int devlen = 0;
 640        uint32_t alloclen;
 641        int ret;
 642
 643        if (!new_valid_dev(rdev))
 644                return -EINVAL;
 645
 646        ri = jffs2_alloc_raw_inode();
 647        if (!ri)
 648                return -ENOMEM;
 649
 650        c = JFFS2_SB_INFO(dir_i->i_sb);
 651
 652        if (S_ISBLK(mode) || S_ISCHR(mode))
 653                devlen = jffs2_encode_dev(&dev, rdev);
 654
 655        /* Try to reserve enough space for both node and dirent.
 656         * Just the node will do for now, though
 657         */
 658        namelen = dentry->d_name.len;
 659        ret = jffs2_reserve_space(c, sizeof(*ri) + devlen, &alloclen,
 660                                  ALLOC_NORMAL, JFFS2_SUMMARY_INODE_SIZE);
 661
 662        if (ret) {
 663                jffs2_free_raw_inode(ri);
 664                return ret;
 665        }
 666
 667        inode = jffs2_new_inode(dir_i, mode, ri);
 668
 669        if (IS_ERR(inode)) {
 670                jffs2_free_raw_inode(ri);
 671                jffs2_complete_reservation(c);
 672                return PTR_ERR(inode);
 673        }
 674        inode->i_op = &jffs2_file_inode_operations;
 675        init_special_inode(inode, inode->i_mode, rdev);
 676
 677        f = JFFS2_INODE_INFO(inode);
 678
 679        ri->dsize = ri->csize = cpu_to_je32(devlen);
 680        ri->totlen = cpu_to_je32(sizeof(*ri) + devlen);
 681        ri->hdr_crc = cpu_to_je32(crc32(0, ri, sizeof(struct jffs2_unknown_node)-4));
 682
 683        ri->compr = JFFS2_COMPR_NONE;
 684        ri->data_crc = cpu_to_je32(crc32(0, &dev, devlen));
 685        ri->node_crc = cpu_to_je32(crc32(0, ri, sizeof(*ri)-8));
 686
 687        fn = jffs2_write_dnode(c, f, ri, (char *)&dev, devlen, ALLOC_NORMAL);
 688
 689        jffs2_free_raw_inode(ri);
 690
 691        if (IS_ERR(fn)) {
 692                /* Eeek. Wave bye bye */
 693                mutex_unlock(&f->sem);
 694                jffs2_complete_reservation(c);
 695                ret = PTR_ERR(fn);
 696                goto fail;
 697        }
 698        /* No data here. Only a metadata node, which will be
 699           obsoleted by the first data write
 700        */
 701        f->metadata = fn;
 702        mutex_unlock(&f->sem);
 703
 704        jffs2_complete_reservation(c);
 705
 706        ret = jffs2_init_security(inode, dir_i);
 707        if (ret)
 708                goto fail;
 709
 710        ret = jffs2_init_acl_post(inode);
 711        if (ret)
 712                goto fail;
 713
 714        ret = jffs2_reserve_space(c, sizeof(*rd)+namelen, &alloclen,
 715                                  ALLOC_NORMAL, JFFS2_SUMMARY_DIRENT_SIZE(namelen));
 716        if (ret)
 717                goto fail;
 718
 719        rd = jffs2_alloc_raw_dirent();
 720        if (!rd) {
 721                /* Argh. Now we treat it like a normal delete */
 722                jffs2_complete_reservation(c);
 723                ret = -ENOMEM;
 724                goto fail;
 725        }
 726
 727        dir_f = JFFS2_INODE_INFO(dir_i);
 728        mutex_lock(&dir_f->sem);
 729
 730        rd->magic = cpu_to_je16(JFFS2_MAGIC_BITMASK);
 731        rd->nodetype = cpu_to_je16(JFFS2_NODETYPE_DIRENT);
 732        rd->totlen = cpu_to_je32(sizeof(*rd) + namelen);
 733        rd->hdr_crc = cpu_to_je32(crc32(0, rd, sizeof(struct jffs2_unknown_node)-4));
 734
 735        rd->pino = cpu_to_je32(dir_i->i_ino);
 736        rd->version = cpu_to_je32(++dir_f->highest_version);
 737        rd->ino = cpu_to_je32(inode->i_ino);
 738        rd->mctime = cpu_to_je32(get_seconds());
 739        rd->nsize = namelen;
 740
 741        /* XXX: This is ugly. */
 742        rd->type = (mode & S_IFMT) >> 12;
 743
 744        rd->node_crc = cpu_to_je32(crc32(0, rd, sizeof(*rd)-8));
 745        rd->name_crc = cpu_to_je32(crc32(0, dentry->d_name.name, namelen));
 746
 747        fd = jffs2_write_dirent(c, dir_f, rd, dentry->d_name.name, namelen, ALLOC_NORMAL);
 748
 749        if (IS_ERR(fd)) {
 750                /* dirent failed to write. Delete the inode normally
 751                   as if it were the final unlink() */
 752                jffs2_complete_reservation(c);
 753                jffs2_free_raw_dirent(rd);
 754                mutex_unlock(&dir_f->sem);
 755                ret = PTR_ERR(fd);
 756                goto fail;
 757        }
 758
 759        dir_i->i_mtime = dir_i->i_ctime = ITIME(je32_to_cpu(rd->mctime));
 760
 761        jffs2_free_raw_dirent(rd);
 762
 763        /* Link the fd into the inode's list, obsoleting an old
 764           one if necessary. */
 765        jffs2_add_fd_to_list(c, fd, &dir_f->dents);
 766
 767        mutex_unlock(&dir_f->sem);
 768        jffs2_complete_reservation(c);
 769
 770        d_instantiate(dentry, inode);
 771        unlock_new_inode(inode);
 772        return 0;
 773
 774 fail:
 775        iget_failed(inode);
 776        return ret;
 777}
 778
 779static int jffs2_rename (struct inode *old_dir_i, struct dentry *old_dentry,
 780                         struct inode *new_dir_i, struct dentry *new_dentry)
 781{
 782        int ret;
 783        struct jffs2_sb_info *c = JFFS2_SB_INFO(old_dir_i->i_sb);
 784        struct jffs2_inode_info *victim_f = NULL;
 785        uint8_t type;
 786        uint32_t now;
 787
 788        /* The VFS will check for us and prevent trying to rename a
 789         * file over a directory and vice versa, but if it's a directory,
 790         * the VFS can't check whether the victim is empty. The filesystem
 791         * needs to do that for itself.
 792         */
 793        if (new_dentry->d_inode) {
 794                victim_f = JFFS2_INODE_INFO(new_dentry->d_inode);
 795                if (S_ISDIR(new_dentry->d_inode->i_mode)) {
 796                        struct jffs2_full_dirent *fd;
 797
 798                        mutex_lock(&victim_f->sem);
 799                        for (fd = victim_f->dents; fd; fd = fd->next) {
 800                                if (fd->ino) {
 801                                        mutex_unlock(&victim_f->sem);
 802                                        return -ENOTEMPTY;
 803                                }
 804                        }
 805                        mutex_unlock(&victim_f->sem);
 806                }
 807        }
 808
 809        /* XXX: We probably ought to alloc enough space for
 810           both nodes at the same time. Writing the new link,
 811           then getting -ENOSPC, is quite bad :)
 812        */
 813
 814        /* Make a hard link */
 815
 816        /* XXX: This is ugly */
 817        type = (old_dentry->d_inode->i_mode & S_IFMT) >> 12;
 818        if (!type) type = DT_REG;
 819
 820        now = get_seconds();
 821        ret = jffs2_do_link(c, JFFS2_INODE_INFO(new_dir_i),
 822                            old_dentry->d_inode->i_ino, type,
 823                            new_dentry->d_name.name, new_dentry->d_name.len, now);
 824
 825        if (ret)
 826                return ret;
 827
 828        if (victim_f) {
 829                /* There was a victim. Kill it off nicely */
 830                drop_nlink(new_dentry->d_inode);
 831                /* Don't oops if the victim was a dirent pointing to an
 832                   inode which didn't exist. */
 833                if (victim_f->inocache) {
 834                        mutex_lock(&victim_f->sem);
 835                        if (S_ISDIR(new_dentry->d_inode->i_mode))
 836                                victim_f->inocache->pino_nlink = 0;
 837                        else
 838                                victim_f->inocache->pino_nlink--;
 839                        mutex_unlock(&victim_f->sem);
 840                }
 841        }
 842
 843        /* If it was a directory we moved, and there was no victim,
 844           increase i_nlink on its new parent */
 845        if (S_ISDIR(old_dentry->d_inode->i_mode) && !victim_f)
 846                inc_nlink(new_dir_i);
 847
 848        /* Unlink the original */
 849        ret = jffs2_do_unlink(c, JFFS2_INODE_INFO(old_dir_i),
 850                              old_dentry->d_name.name, old_dentry->d_name.len, NULL, now);
 851
 852        /* We don't touch inode->i_nlink */
 853
 854        if (ret) {
 855                /* Oh shit. We really ought to make a single node which can do both atomically */
 856                struct jffs2_inode_info *f = JFFS2_INODE_INFO(old_dentry->d_inode);
 857                mutex_lock(&f->sem);
 858                inc_nlink(old_dentry->d_inode);
 859                if (f->inocache && !S_ISDIR(old_dentry->d_inode->i_mode))
 860                        f->inocache->pino_nlink++;
 861                mutex_unlock(&f->sem);
 862
 863                printk(KERN_NOTICE "jffs2_rename(): Link succeeded, unlink failed (err %d). You now have a hard link\n", ret);
 864                /* Might as well let the VFS know */
 865                d_instantiate(new_dentry, old_dentry->d_inode);
 866                ihold(old_dentry->d_inode);
 867                new_dir_i->i_mtime = new_dir_i->i_ctime = ITIME(now);
 868                return ret;
 869        }
 870
 871        if (S_ISDIR(old_dentry->d_inode->i_mode))
 872                drop_nlink(old_dir_i);
 873
 874        new_dir_i->i_mtime = new_dir_i->i_ctime = old_dir_i->i_mtime = old_dir_i->i_ctime = ITIME(now);
 875
 876        return 0;
 877}
 878
 879