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