linux/fs/hpfs/dnode.c
<<
>>
Prefs
   1/*
   2 *  linux/fs/hpfs/dnode.c
   3 *
   4 *  Mikulas Patocka (mikulas@artax.karlin.mff.cuni.cz), 1998-1999
   5 *
   6 *  handling directory dnode tree - adding, deleteing & searching for dirents
   7 */
   8
   9#include "hpfs_fn.h"
  10
  11static loff_t get_pos(struct dnode *d, struct hpfs_dirent *fde)
  12{
  13        struct hpfs_dirent *de;
  14        struct hpfs_dirent *de_end = dnode_end_de(d);
  15        int i = 1;
  16        for (de = dnode_first_de(d); de < de_end; de = de_next_de(de)) {
  17                if (de == fde) return ((loff_t) le32_to_cpu(d->self) << 4) | (loff_t)i;
  18                i++;
  19        }
  20        pr_info("%s(): not_found\n", __func__);
  21        return ((loff_t)le32_to_cpu(d->self) << 4) | (loff_t)1;
  22}
  23
  24int hpfs_add_pos(struct inode *inode, loff_t *pos)
  25{
  26        struct hpfs_inode_info *hpfs_inode = hpfs_i(inode);
  27        int i = 0;
  28        loff_t **ppos;
  29
  30        if (hpfs_inode->i_rddir_off)
  31                for (; hpfs_inode->i_rddir_off[i]; i++)
  32                        if (hpfs_inode->i_rddir_off[i] == pos)
  33                                return 0;
  34        if (!(i&0x0f)) {
  35                if (!(ppos = kmalloc((i+0x11) * sizeof(loff_t*), GFP_NOFS))) {
  36                        pr_err("out of memory for position list\n");
  37                        return -ENOMEM;
  38                }
  39                if (hpfs_inode->i_rddir_off) {
  40                        memcpy(ppos, hpfs_inode->i_rddir_off, i * sizeof(loff_t));
  41                        kfree(hpfs_inode->i_rddir_off);
  42                }
  43                hpfs_inode->i_rddir_off = ppos;
  44        }
  45        hpfs_inode->i_rddir_off[i] = pos;
  46        hpfs_inode->i_rddir_off[i + 1] = NULL;
  47        return 0;
  48}
  49
  50void hpfs_del_pos(struct inode *inode, loff_t *pos)
  51{
  52        struct hpfs_inode_info *hpfs_inode = hpfs_i(inode);
  53        loff_t **i, **j;
  54
  55        if (!hpfs_inode->i_rddir_off) goto not_f;
  56        for (i = hpfs_inode->i_rddir_off; *i; i++) if (*i == pos) goto fnd;
  57        goto not_f;
  58        fnd:
  59        for (j = i + 1; *j; j++) ;
  60        *i = *(j - 1);
  61        *(j - 1) = NULL;
  62        if (j - 1 == hpfs_inode->i_rddir_off) {
  63                kfree(hpfs_inode->i_rddir_off);
  64                hpfs_inode->i_rddir_off = NULL;
  65        }
  66        return;
  67        not_f:
  68        /*pr_warn("position pointer %p->%08x not found\n",
  69                  pos, (int)*pos);*/
  70        return;
  71}
  72
  73static void for_all_poss(struct inode *inode, void (*f)(loff_t *, loff_t, loff_t),
  74                         loff_t p1, loff_t p2)
  75{
  76        struct hpfs_inode_info *hpfs_inode = hpfs_i(inode);
  77        loff_t **i;
  78
  79        if (!hpfs_inode->i_rddir_off) return;
  80        for (i = hpfs_inode->i_rddir_off; *i; i++) (*f)(*i, p1, p2);
  81        return;
  82}
  83
  84static void hpfs_pos_subst(loff_t *p, loff_t f, loff_t t)
  85{
  86        if (*p == f) *p = t;
  87}
  88
  89/*void hpfs_hpfs_pos_substd(loff_t *p, loff_t f, loff_t t)
  90{
  91        if ((*p & ~0x3f) == (f & ~0x3f)) *p = (t & ~0x3f) | (*p & 0x3f);
  92}*/
  93
  94static void hpfs_pos_ins(loff_t *p, loff_t d, loff_t c)
  95{
  96        if ((*p & ~0x3f) == (d & ~0x3f) && (*p & 0x3f) >= (d & 0x3f)) {
  97                int n = (*p & 0x3f) + c;
  98                if (n > 0x3f)
  99                        pr_err("%s(): %08x + %d\n",
 100                                __func__, (int)*p, (int)c >> 8);
 101                else
 102                        *p = (*p & ~0x3f) | n;
 103        }
 104}
 105
 106static void hpfs_pos_del(loff_t *p, loff_t d, loff_t c)
 107{
 108        if ((*p & ~0x3f) == (d & ~0x3f) && (*p & 0x3f) >= (d & 0x3f)) {
 109                int n = (*p & 0x3f) - c;
 110                if (n < 1)
 111                        pr_err("%s(): %08x - %d\n",
 112                                __func__, (int)*p, (int)c >> 8);
 113                else
 114                        *p = (*p & ~0x3f) | n;
 115        }
 116}
 117
 118static struct hpfs_dirent *dnode_pre_last_de(struct dnode *d)
 119{
 120        struct hpfs_dirent *de, *de_end, *dee = NULL, *deee = NULL;
 121        de_end = dnode_end_de(d);
 122        for (de = dnode_first_de(d); de < de_end; de = de_next_de(de)) {
 123                deee = dee; dee = de;
 124        }       
 125        return deee;
 126}
 127
 128static struct hpfs_dirent *dnode_last_de(struct dnode *d)
 129{
 130        struct hpfs_dirent *de, *de_end, *dee = NULL;
 131        de_end = dnode_end_de(d);
 132        for (de = dnode_first_de(d); de < de_end; de = de_next_de(de)) {
 133                dee = de;
 134        }       
 135        return dee;
 136}
 137
 138static void set_last_pointer(struct super_block *s, struct dnode *d, dnode_secno ptr)
 139{
 140        struct hpfs_dirent *de;
 141        if (!(de = dnode_last_de(d))) {
 142                hpfs_error(s, "set_last_pointer: empty dnode %08x", le32_to_cpu(d->self));
 143                return;
 144        }
 145        if (hpfs_sb(s)->sb_chk) {
 146                if (de->down) {
 147                        hpfs_error(s, "set_last_pointer: dnode %08x has already last pointer %08x",
 148                                le32_to_cpu(d->self), de_down_pointer(de));
 149                        return;
 150                }
 151                if (le16_to_cpu(de->length) != 32) {
 152                        hpfs_error(s, "set_last_pointer: bad last dirent in dnode %08x", le32_to_cpu(d->self));
 153                        return;
 154                }
 155        }
 156        if (ptr) {
 157                le32_add_cpu(&d->first_free, 4);
 158                if (le32_to_cpu(d->first_free) > 2048) {
 159                        hpfs_error(s, "set_last_pointer: too long dnode %08x", le32_to_cpu(d->self));
 160                        le32_add_cpu(&d->first_free, -4);
 161                        return;
 162                }
 163                de->length = cpu_to_le16(36);
 164                de->down = 1;
 165                *(__le32 *)((char *)de + 32) = cpu_to_le32(ptr);
 166        }
 167}
 168
 169/* Add an entry to dnode and don't care if it grows over 2048 bytes */
 170
 171struct hpfs_dirent *hpfs_add_de(struct super_block *s, struct dnode *d,
 172                                const unsigned char *name,
 173                                unsigned namelen, secno down_ptr)
 174{
 175        struct hpfs_dirent *de;
 176        struct hpfs_dirent *de_end = dnode_end_de(d);
 177        unsigned d_size = de_size(namelen, down_ptr);
 178        for (de = dnode_first_de(d); de < de_end; de = de_next_de(de)) {
 179                int c = hpfs_compare_names(s, name, namelen, de->name, de->namelen, de->last);
 180                if (!c) {
 181                        hpfs_error(s, "name (%c,%d) already exists in dnode %08x", *name, namelen, le32_to_cpu(d->self));
 182                        return NULL;
 183                }
 184                if (c < 0) break;
 185        }
 186        memmove((char *)de + d_size, de, (char *)de_end - (char *)de);
 187        memset(de, 0, d_size);
 188        if (down_ptr) {
 189                *(__le32 *)((char *)de + d_size - 4) = cpu_to_le32(down_ptr);
 190                de->down = 1;
 191        }
 192        de->length = cpu_to_le16(d_size);
 193        de->not_8x3 = hpfs_is_name_long(name, namelen);
 194        de->namelen = namelen;
 195        memcpy(de->name, name, namelen);
 196        le32_add_cpu(&d->first_free, d_size);
 197        return de;
 198}
 199
 200/* Delete dirent and don't care about its subtree */
 201
 202static void hpfs_delete_de(struct super_block *s, struct dnode *d,
 203                           struct hpfs_dirent *de)
 204{
 205        if (de->last) {
 206                hpfs_error(s, "attempt to delete last dirent in dnode %08x", le32_to_cpu(d->self));
 207                return;
 208        }
 209        d->first_free = cpu_to_le32(le32_to_cpu(d->first_free) - le16_to_cpu(de->length));
 210        memmove(de, de_next_de(de), le32_to_cpu(d->first_free) + (char *)d - (char *)de);
 211}
 212
 213static void fix_up_ptrs(struct super_block *s, struct dnode *d)
 214{
 215        struct hpfs_dirent *de;
 216        struct hpfs_dirent *de_end = dnode_end_de(d);
 217        dnode_secno dno = le32_to_cpu(d->self);
 218        for (de = dnode_first_de(d); de < de_end; de = de_next_de(de))
 219                if (de->down) {
 220                        struct quad_buffer_head qbh;
 221                        struct dnode *dd;
 222                        if ((dd = hpfs_map_dnode(s, de_down_pointer(de), &qbh))) {
 223                                if (le32_to_cpu(dd->up) != dno || dd->root_dnode) {
 224                                        dd->up = cpu_to_le32(dno);
 225                                        dd->root_dnode = 0;
 226                                        hpfs_mark_4buffers_dirty(&qbh);
 227                                }
 228                                hpfs_brelse4(&qbh);
 229                        }
 230                }
 231}
 232
 233/* Add an entry to dnode and do dnode splitting if required */
 234
 235static int hpfs_add_to_dnode(struct inode *i, dnode_secno dno,
 236                             const unsigned char *name, unsigned namelen,
 237                             struct hpfs_dirent *new_de, dnode_secno down_ptr)
 238{
 239        struct quad_buffer_head qbh, qbh1, qbh2;
 240        struct dnode *d, *ad, *rd, *nd = NULL;
 241        dnode_secno adno, rdno;
 242        struct hpfs_dirent *de;
 243        struct hpfs_dirent nde;
 244        unsigned char *nname;
 245        int h;
 246        int pos;
 247        struct buffer_head *bh;
 248        struct fnode *fnode;
 249        int c1, c2 = 0;
 250        if (!(nname = kmalloc(256, GFP_NOFS))) {
 251                pr_err("out of memory, can't add to dnode\n");
 252                return 1;
 253        }
 254        go_up:
 255        if (namelen >= 256) {
 256                hpfs_error(i->i_sb, "%s(): namelen == %d", __func__, namelen);
 257                kfree(nd);
 258                kfree(nname);
 259                return 1;
 260        }
 261        if (!(d = hpfs_map_dnode(i->i_sb, dno, &qbh))) {
 262                kfree(nd);
 263                kfree(nname);
 264                return 1;
 265        }
 266        go_up_a:
 267        if (hpfs_sb(i->i_sb)->sb_chk)
 268                if (hpfs_stop_cycles(i->i_sb, dno, &c1, &c2, "hpfs_add_to_dnode")) {
 269                        hpfs_brelse4(&qbh);
 270                        kfree(nd);
 271                        kfree(nname);
 272                        return 1;
 273                }
 274        if (le32_to_cpu(d->first_free) + de_size(namelen, down_ptr) <= 2048) {
 275                loff_t t;
 276                copy_de(de=hpfs_add_de(i->i_sb, d, name, namelen, down_ptr), new_de);
 277                t = get_pos(d, de);
 278                for_all_poss(i, hpfs_pos_ins, t, 1);
 279                for_all_poss(i, hpfs_pos_subst, 4, t);
 280                for_all_poss(i, hpfs_pos_subst, 5, t + 1);
 281                hpfs_mark_4buffers_dirty(&qbh);
 282                hpfs_brelse4(&qbh);
 283                kfree(nd);
 284                kfree(nname);
 285                return 0;
 286        }
 287        if (!nd) if (!(nd = kmalloc(0x924, GFP_NOFS))) {
 288                /* 0x924 is a max size of dnode after adding a dirent with
 289                   max name length. We alloc this only once. There must
 290                   not be any error while splitting dnodes, otherwise the
 291                   whole directory, not only file we're adding, would
 292                   be lost. */
 293                pr_err("out of memory for dnode splitting\n");
 294                hpfs_brelse4(&qbh);
 295                kfree(nname);
 296                return 1;
 297        }       
 298        memcpy(nd, d, le32_to_cpu(d->first_free));
 299        copy_de(de = hpfs_add_de(i->i_sb, nd, name, namelen, down_ptr), new_de);
 300        for_all_poss(i, hpfs_pos_ins, get_pos(nd, de), 1);
 301        h = ((char *)dnode_last_de(nd) - (char *)nd) / 2 + 10;
 302        if (!(ad = hpfs_alloc_dnode(i->i_sb, le32_to_cpu(d->up), &adno, &qbh1))) {
 303                hpfs_error(i->i_sb, "unable to alloc dnode - dnode tree will be corrupted");
 304                hpfs_brelse4(&qbh);
 305                kfree(nd);
 306                kfree(nname);
 307                return 1;
 308        }
 309        i->i_size += 2048;
 310        i->i_blocks += 4;
 311        pos = 1;
 312        for (de = dnode_first_de(nd); (char *)de_next_de(de) - (char *)nd < h; de = de_next_de(de)) {
 313                copy_de(hpfs_add_de(i->i_sb, ad, de->name, de->namelen, de->down ? de_down_pointer(de) : 0), de);
 314                for_all_poss(i, hpfs_pos_subst, ((loff_t)dno << 4) | pos, ((loff_t)adno << 4) | pos);
 315                pos++;
 316        }
 317        copy_de(new_de = &nde, de);
 318        memcpy(nname, de->name, de->namelen);
 319        name = nname;
 320        namelen = de->namelen;
 321        for_all_poss(i, hpfs_pos_subst, ((loff_t)dno << 4) | pos, 4);
 322        down_ptr = adno;
 323        set_last_pointer(i->i_sb, ad, de->down ? de_down_pointer(de) : 0);
 324        de = de_next_de(de);
 325        memmove((char *)nd + 20, de, le32_to_cpu(nd->first_free) + (char *)nd - (char *)de);
 326        le32_add_cpu(&nd->first_free, -((char *)de - (char *)nd - 20));
 327        memcpy(d, nd, le32_to_cpu(nd->first_free));
 328        for_all_poss(i, hpfs_pos_del, (loff_t)dno << 4, pos);
 329        fix_up_ptrs(i->i_sb, ad);
 330        if (!d->root_dnode) {
 331                ad->up = d->up;
 332                dno = le32_to_cpu(ad->up);
 333                hpfs_mark_4buffers_dirty(&qbh);
 334                hpfs_brelse4(&qbh);
 335                hpfs_mark_4buffers_dirty(&qbh1);
 336                hpfs_brelse4(&qbh1);
 337                goto go_up;
 338        }
 339        if (!(rd = hpfs_alloc_dnode(i->i_sb, le32_to_cpu(d->up), &rdno, &qbh2))) {
 340                hpfs_error(i->i_sb, "unable to alloc dnode - dnode tree will be corrupted");
 341                hpfs_brelse4(&qbh);
 342                hpfs_brelse4(&qbh1);
 343                kfree(nd);
 344                kfree(nname);
 345                return 1;
 346        }
 347        i->i_size += 2048;
 348        i->i_blocks += 4;
 349        rd->root_dnode = 1;
 350        rd->up = d->up;
 351        if (!(fnode = hpfs_map_fnode(i->i_sb, le32_to_cpu(d->up), &bh))) {
 352                hpfs_free_dnode(i->i_sb, rdno);
 353                hpfs_brelse4(&qbh);
 354                hpfs_brelse4(&qbh1);
 355                hpfs_brelse4(&qbh2);
 356                kfree(nd);
 357                kfree(nname);
 358                return 1;
 359        }
 360        fnode->u.external[0].disk_secno = cpu_to_le32(rdno);
 361        mark_buffer_dirty(bh);
 362        brelse(bh);
 363        hpfs_i(i)->i_dno = rdno;
 364        d->up = ad->up = cpu_to_le32(rdno);
 365        d->root_dnode = ad->root_dnode = 0;
 366        hpfs_mark_4buffers_dirty(&qbh);
 367        hpfs_brelse4(&qbh);
 368        hpfs_mark_4buffers_dirty(&qbh1);
 369        hpfs_brelse4(&qbh1);
 370        qbh = qbh2;
 371        set_last_pointer(i->i_sb, rd, dno);
 372        dno = rdno;
 373        d = rd;
 374        goto go_up_a;
 375}
 376
 377/*
 378 * Add an entry to directory btree.
 379 * I hate such crazy directory structure.
 380 * It's easy to read but terrible to write.
 381 * I wrote this directory code 4 times.
 382 * I hope, now it's finally bug-free.
 383 */
 384
 385int hpfs_add_dirent(struct inode *i,
 386                    const unsigned char *name, unsigned namelen,
 387                    struct hpfs_dirent *new_de)
 388{
 389        struct hpfs_inode_info *hpfs_inode = hpfs_i(i);
 390        struct dnode *d;
 391        struct hpfs_dirent *de, *de_end;
 392        struct quad_buffer_head qbh;
 393        dnode_secno dno;
 394        int c;
 395        int c1, c2 = 0;
 396        dno = hpfs_inode->i_dno;
 397        down:
 398        if (hpfs_sb(i->i_sb)->sb_chk)
 399                if (hpfs_stop_cycles(i->i_sb, dno, &c1, &c2, "hpfs_add_dirent")) return 1;
 400        if (!(d = hpfs_map_dnode(i->i_sb, dno, &qbh))) return 1;
 401        de_end = dnode_end_de(d);
 402        for (de = dnode_first_de(d); de < de_end; de = de_next_de(de)) {
 403                if (!(c = hpfs_compare_names(i->i_sb, name, namelen, de->name, de->namelen, de->last))) {
 404                        hpfs_brelse4(&qbh);
 405                        return -1;
 406                }       
 407                if (c < 0) {
 408                        if (de->down) {
 409                                dno = de_down_pointer(de);
 410                                hpfs_brelse4(&qbh);
 411                                goto down;
 412                        }
 413                        break;
 414                }
 415        }
 416        hpfs_brelse4(&qbh);
 417        if (hpfs_check_free_dnodes(i->i_sb, FREE_DNODES_ADD)) {
 418                c = 1;
 419                goto ret;
 420        }       
 421        i->i_version++;
 422        c = hpfs_add_to_dnode(i, dno, name, namelen, new_de, 0);
 423        ret:
 424        return c;
 425}
 426
 427/* 
 428 * Find dirent with higher name in 'from' subtree and move it to 'to' dnode.
 429 * Return the dnode we moved from (to be checked later if it's empty)
 430 */
 431
 432static secno move_to_top(struct inode *i, dnode_secno from, dnode_secno to)
 433{
 434        dnode_secno dno, ddno;
 435        dnode_secno chk_up = to;
 436        struct dnode *dnode;
 437        struct quad_buffer_head qbh;
 438        struct hpfs_dirent *de, *nde;
 439        int a;
 440        loff_t t;
 441        int c1, c2 = 0;
 442        dno = from;
 443        while (1) {
 444                if (hpfs_sb(i->i_sb)->sb_chk)
 445                        if (hpfs_stop_cycles(i->i_sb, dno, &c1, &c2, "move_to_top"))
 446                                return 0;
 447                if (!(dnode = hpfs_map_dnode(i->i_sb, dno, &qbh))) return 0;
 448                if (hpfs_sb(i->i_sb)->sb_chk) {
 449                        if (le32_to_cpu(dnode->up) != chk_up) {
 450                                hpfs_error(i->i_sb, "move_to_top: up pointer from %08x should be %08x, is %08x",
 451                                        dno, chk_up, le32_to_cpu(dnode->up));
 452                                hpfs_brelse4(&qbh);
 453                                return 0;
 454                        }
 455                        chk_up = dno;
 456                }
 457                if (!(de = dnode_last_de(dnode))) {
 458                        hpfs_error(i->i_sb, "move_to_top: dnode %08x has no last de", dno);
 459                        hpfs_brelse4(&qbh);
 460                        return 0;
 461                }
 462                if (!de->down) break;
 463                dno = de_down_pointer(de);
 464                hpfs_brelse4(&qbh);
 465        }
 466        while (!(de = dnode_pre_last_de(dnode))) {
 467                dnode_secno up = le32_to_cpu(dnode->up);
 468                hpfs_brelse4(&qbh);
 469                hpfs_free_dnode(i->i_sb, dno);
 470                i->i_size -= 2048;
 471                i->i_blocks -= 4;
 472                for_all_poss(i, hpfs_pos_subst, ((loff_t)dno << 4) | 1, 5);
 473                if (up == to) return to;
 474                if (!(dnode = hpfs_map_dnode(i->i_sb, up, &qbh))) return 0;
 475                if (dnode->root_dnode) {
 476                        hpfs_error(i->i_sb, "move_to_top: got to root_dnode while moving from %08x to %08x", from, to);
 477                        hpfs_brelse4(&qbh);
 478                        return 0;
 479                }
 480                de = dnode_last_de(dnode);
 481                if (!de || !de->down) {
 482                        hpfs_error(i->i_sb, "move_to_top: dnode %08x doesn't point down to %08x", up, dno);
 483                        hpfs_brelse4(&qbh);
 484                        return 0;
 485                }
 486                le32_add_cpu(&dnode->first_free, -4);
 487                le16_add_cpu(&de->length, -4);
 488                de->down = 0;
 489                hpfs_mark_4buffers_dirty(&qbh);
 490                dno = up;
 491        }
 492        t = get_pos(dnode, de);
 493        for_all_poss(i, hpfs_pos_subst, t, 4);
 494        for_all_poss(i, hpfs_pos_subst, t + 1, 5);
 495        if (!(nde = kmalloc(le16_to_cpu(de->length), GFP_NOFS))) {
 496                hpfs_error(i->i_sb, "out of memory for dirent - directory will be corrupted");
 497                hpfs_brelse4(&qbh);
 498                return 0;
 499        }
 500        memcpy(nde, de, le16_to_cpu(de->length));
 501        ddno = de->down ? de_down_pointer(de) : 0;
 502        hpfs_delete_de(i->i_sb, dnode, de);
 503        set_last_pointer(i->i_sb, dnode, ddno);
 504        hpfs_mark_4buffers_dirty(&qbh);
 505        hpfs_brelse4(&qbh);
 506        a = hpfs_add_to_dnode(i, to, nde->name, nde->namelen, nde, from);
 507        kfree(nde);
 508        if (a) return 0;
 509        return dno;
 510}
 511
 512/* 
 513 * Check if a dnode is empty and delete it from the tree
 514 * (chkdsk doesn't like empty dnodes)
 515 */
 516
 517static void delete_empty_dnode(struct inode *i, dnode_secno dno)
 518{
 519        struct hpfs_inode_info *hpfs_inode = hpfs_i(i);
 520        struct quad_buffer_head qbh;
 521        struct dnode *dnode;
 522        dnode_secno down, up, ndown;
 523        int p;
 524        struct hpfs_dirent *de;
 525        int c1, c2 = 0;
 526        try_it_again:
 527        if (hpfs_stop_cycles(i->i_sb, dno, &c1, &c2, "delete_empty_dnode")) return;
 528        if (!(dnode = hpfs_map_dnode(i->i_sb, dno, &qbh))) return;
 529        if (le32_to_cpu(dnode->first_free) > 56) goto end;
 530        if (le32_to_cpu(dnode->first_free) == 52 || le32_to_cpu(dnode->first_free) == 56) {
 531                struct hpfs_dirent *de_end;
 532                int root = dnode->root_dnode;
 533                up = le32_to_cpu(dnode->up);
 534                de = dnode_first_de(dnode);
 535                down = de->down ? de_down_pointer(de) : 0;
 536                if (hpfs_sb(i->i_sb)->sb_chk) if (root && !down) {
 537                        hpfs_error(i->i_sb, "delete_empty_dnode: root dnode %08x is empty", dno);
 538                        goto end;
 539                }
 540                hpfs_brelse4(&qbh);
 541                hpfs_free_dnode(i->i_sb, dno);
 542                i->i_size -= 2048;
 543                i->i_blocks -= 4;
 544                if (root) {
 545                        struct fnode *fnode;
 546                        struct buffer_head *bh;
 547                        struct dnode *d1;
 548                        struct quad_buffer_head qbh1;
 549                        if (hpfs_sb(i->i_sb)->sb_chk)
 550                                if (up != i->i_ino) {
 551                                        hpfs_error(i->i_sb,
 552                                                   "bad pointer to fnode, dnode %08x, pointing to %08x, should be %08lx",
 553                                                   dno, up,
 554                                                   (unsigned long)i->i_ino);
 555                                        return;
 556                                }
 557                        if ((d1 = hpfs_map_dnode(i->i_sb, down, &qbh1))) {
 558                                d1->up = cpu_to_le32(up);
 559                                d1->root_dnode = 1;
 560                                hpfs_mark_4buffers_dirty(&qbh1);
 561                                hpfs_brelse4(&qbh1);
 562                        }
 563                        if ((fnode = hpfs_map_fnode(i->i_sb, up, &bh))) {
 564                                fnode->u.external[0].disk_secno = cpu_to_le32(down);
 565                                mark_buffer_dirty(bh);
 566                                brelse(bh);
 567                        }
 568                        hpfs_inode->i_dno = down;
 569                        for_all_poss(i, hpfs_pos_subst, ((loff_t)dno << 4) | 1, (loff_t) 12);
 570                        return;
 571                }
 572                if (!(dnode = hpfs_map_dnode(i->i_sb, up, &qbh))) return;
 573                p = 1;
 574                de_end = dnode_end_de(dnode);
 575                for (de = dnode_first_de(dnode); de < de_end; de = de_next_de(de), p++)
 576                        if (de->down) if (de_down_pointer(de) == dno) goto fnd;
 577                hpfs_error(i->i_sb, "delete_empty_dnode: pointer to dnode %08x not found in dnode %08x", dno, up);
 578                goto end;
 579                fnd:
 580                for_all_poss(i, hpfs_pos_subst, ((loff_t)dno << 4) | 1, ((loff_t)up << 4) | p);
 581                if (!down) {
 582                        de->down = 0;
 583                        le16_add_cpu(&de->length, -4);
 584                        le32_add_cpu(&dnode->first_free, -4);
 585                        memmove(de_next_de(de), (char *)de_next_de(de) + 4,
 586                                (char *)dnode + le32_to_cpu(dnode->first_free) - (char *)de_next_de(de));
 587                } else {
 588                        struct dnode *d1;
 589                        struct quad_buffer_head qbh1;
 590                        *(dnode_secno *) ((void *) de + le16_to_cpu(de->length) - 4) = down;
 591                        if ((d1 = hpfs_map_dnode(i->i_sb, down, &qbh1))) {
 592                                d1->up = cpu_to_le32(up);
 593                                hpfs_mark_4buffers_dirty(&qbh1);
 594                                hpfs_brelse4(&qbh1);
 595                        }
 596                }
 597        } else {
 598                hpfs_error(i->i_sb, "delete_empty_dnode: dnode %08x, first_free == %03x", dno, le32_to_cpu(dnode->first_free));
 599                goto end;
 600        }
 601
 602        if (!de->last) {
 603                struct hpfs_dirent *de_next = de_next_de(de);
 604                struct hpfs_dirent *de_cp;
 605                struct dnode *d1;
 606                struct quad_buffer_head qbh1;
 607                if (!de_next->down) goto endm;
 608                ndown = de_down_pointer(de_next);
 609                if (!(de_cp = kmalloc(le16_to_cpu(de->length), GFP_NOFS))) {
 610                        pr_err("out of memory for dtree balancing\n");
 611                        goto endm;
 612                }
 613                memcpy(de_cp, de, le16_to_cpu(de->length));
 614                hpfs_delete_de(i->i_sb, dnode, de);
 615                hpfs_mark_4buffers_dirty(&qbh);
 616                hpfs_brelse4(&qbh);
 617                for_all_poss(i, hpfs_pos_subst, ((loff_t)up << 4) | p, 4);
 618                for_all_poss(i, hpfs_pos_del, ((loff_t)up << 4) | p, 1);
 619                if (de_cp->down) if ((d1 = hpfs_map_dnode(i->i_sb, de_down_pointer(de_cp), &qbh1))) {
 620                        d1->up = cpu_to_le32(ndown);
 621                        hpfs_mark_4buffers_dirty(&qbh1);
 622                        hpfs_brelse4(&qbh1);
 623                }
 624                hpfs_add_to_dnode(i, ndown, de_cp->name, de_cp->namelen, de_cp, de_cp->down ? de_down_pointer(de_cp) : 0);
 625                /*pr_info("UP-TO-DNODE: %08x (ndown = %08x, down = %08x, dno = %08x)\n",
 626                  up, ndown, down, dno);*/
 627                dno = up;
 628                kfree(de_cp);
 629                goto try_it_again;
 630        } else {
 631                struct hpfs_dirent *de_prev = dnode_pre_last_de(dnode);
 632                struct hpfs_dirent *de_cp;
 633                struct dnode *d1;
 634                struct quad_buffer_head qbh1;
 635                dnode_secno dlp;
 636                if (!de_prev) {
 637                        hpfs_error(i->i_sb, "delete_empty_dnode: empty dnode %08x", up);
 638                        hpfs_mark_4buffers_dirty(&qbh);
 639                        hpfs_brelse4(&qbh);
 640                        dno = up;
 641                        goto try_it_again;
 642                }
 643                if (!de_prev->down) goto endm;
 644                ndown = de_down_pointer(de_prev);
 645                if ((d1 = hpfs_map_dnode(i->i_sb, ndown, &qbh1))) {
 646                        struct hpfs_dirent *del = dnode_last_de(d1);
 647                        dlp = del->down ? de_down_pointer(del) : 0;
 648                        if (!dlp && down) {
 649                                if (le32_to_cpu(d1->first_free) > 2044) {
 650                                        if (hpfs_sb(i->i_sb)->sb_chk >= 2) {
 651                                                pr_err("unbalanced dnode tree, see hpfs.txt 4 more info\n");
 652                                                pr_err("terminating balancing operation\n");
 653                                        }
 654                                        hpfs_brelse4(&qbh1);
 655                                        goto endm;
 656                                }
 657                                if (hpfs_sb(i->i_sb)->sb_chk >= 2) {
 658                                        pr_err("unbalanced dnode tree, see hpfs.txt 4 more info\n");
 659                                        pr_err("goin'on\n");
 660                                }
 661                                le16_add_cpu(&del->length, 4);
 662                                del->down = 1;
 663                                le32_add_cpu(&d1->first_free, 4);
 664                        }
 665                        if (dlp && !down) {
 666                                le16_add_cpu(&del->length, -4);
 667                                del->down = 0;
 668                                le32_add_cpu(&d1->first_free, -4);
 669                        } else if (down)
 670                                *(__le32 *) ((void *) del + le16_to_cpu(del->length) - 4) = cpu_to_le32(down);
 671                } else goto endm;
 672                if (!(de_cp = kmalloc(le16_to_cpu(de_prev->length), GFP_NOFS))) {
 673                        pr_err("out of memory for dtree balancing\n");
 674                        hpfs_brelse4(&qbh1);
 675                        goto endm;
 676                }
 677                hpfs_mark_4buffers_dirty(&qbh1);
 678                hpfs_brelse4(&qbh1);
 679                memcpy(de_cp, de_prev, le16_to_cpu(de_prev->length));
 680                hpfs_delete_de(i->i_sb, dnode, de_prev);
 681                if (!de_prev->down) {
 682                        le16_add_cpu(&de_prev->length, 4);
 683                        de_prev->down = 1;
 684                        le32_add_cpu(&dnode->first_free, 4);
 685                }
 686                *(__le32 *) ((void *) de_prev + le16_to_cpu(de_prev->length) - 4) = cpu_to_le32(ndown);
 687                hpfs_mark_4buffers_dirty(&qbh);
 688                hpfs_brelse4(&qbh);
 689                for_all_poss(i, hpfs_pos_subst, ((loff_t)up << 4) | (p - 1), 4);
 690                for_all_poss(i, hpfs_pos_subst, ((loff_t)up << 4) | p, ((loff_t)up << 4) | (p - 1));
 691                if (down) if ((d1 = hpfs_map_dnode(i->i_sb, de_down_pointer(de), &qbh1))) {
 692                        d1->up = cpu_to_le32(ndown);
 693                        hpfs_mark_4buffers_dirty(&qbh1);
 694                        hpfs_brelse4(&qbh1);
 695                }
 696                hpfs_add_to_dnode(i, ndown, de_cp->name, de_cp->namelen, de_cp, dlp);
 697                dno = up;
 698                kfree(de_cp);
 699                goto try_it_again;
 700        }
 701        endm:
 702        hpfs_mark_4buffers_dirty(&qbh);
 703        end:
 704        hpfs_brelse4(&qbh);
 705}
 706
 707
 708/* Delete dirent from directory */
 709
 710int hpfs_remove_dirent(struct inode *i, dnode_secno dno, struct hpfs_dirent *de,
 711                       struct quad_buffer_head *qbh, int depth)
 712{
 713        struct dnode *dnode = qbh->data;
 714        dnode_secno down = 0;
 715        loff_t t;
 716        if (de->first || de->last) {
 717                hpfs_error(i->i_sb, "hpfs_remove_dirent: attempt to delete first or last dirent in dnode %08x", dno);
 718                hpfs_brelse4(qbh);
 719                return 1;
 720        }
 721        if (de->down) down = de_down_pointer(de);
 722        if (depth && (de->down || (de == dnode_first_de(dnode) && de_next_de(de)->last))) {
 723                if (hpfs_check_free_dnodes(i->i_sb, FREE_DNODES_DEL)) {
 724                        hpfs_brelse4(qbh);
 725                        return 2;
 726                }
 727        }
 728        i->i_version++;
 729        for_all_poss(i, hpfs_pos_del, (t = get_pos(dnode, de)) + 1, 1);
 730        hpfs_delete_de(i->i_sb, dnode, de);
 731        hpfs_mark_4buffers_dirty(qbh);
 732        hpfs_brelse4(qbh);
 733        if (down) {
 734                dnode_secno a = move_to_top(i, down, dno);
 735                for_all_poss(i, hpfs_pos_subst, 5, t);
 736                if (a) delete_empty_dnode(i, a);
 737                return !a;
 738        }
 739        delete_empty_dnode(i, dno);
 740        return 0;
 741}
 742
 743void hpfs_count_dnodes(struct super_block *s, dnode_secno dno, int *n_dnodes,
 744                       int *n_subdirs, int *n_items)
 745{
 746        struct dnode *dnode;
 747        struct quad_buffer_head qbh;
 748        struct hpfs_dirent *de;
 749        dnode_secno ptr, odno = 0;
 750        int c1, c2 = 0;
 751        int d1, d2 = 0;
 752        go_down:
 753        if (n_dnodes) (*n_dnodes)++;
 754        if (hpfs_sb(s)->sb_chk)
 755                if (hpfs_stop_cycles(s, dno, &c1, &c2, "hpfs_count_dnodes #1")) return;
 756        ptr = 0;
 757        go_up:
 758        if (!(dnode = hpfs_map_dnode(s, dno, &qbh))) return;
 759        if (hpfs_sb(s)->sb_chk) if (odno && odno != -1 && le32_to_cpu(dnode->up) != odno)
 760                hpfs_error(s, "hpfs_count_dnodes: bad up pointer; dnode %08x, down %08x points to %08x", odno, dno, le32_to_cpu(dnode->up));
 761        de = dnode_first_de(dnode);
 762        if (ptr) while(1) {
 763                if (de->down) if (de_down_pointer(de) == ptr) goto process_de;
 764                if (de->last) {
 765                        hpfs_brelse4(&qbh);
 766                        hpfs_error(s, "hpfs_count_dnodes: pointer to dnode %08x not found in dnode %08x, got here from %08x",
 767                                ptr, dno, odno);
 768                        return;
 769                }
 770                de = de_next_de(de);
 771        }
 772        next_de:
 773        if (de->down) {
 774                odno = dno;
 775                dno = de_down_pointer(de);
 776                hpfs_brelse4(&qbh);
 777                goto go_down;
 778        }
 779        process_de:
 780        if (!de->first && !de->last && de->directory && n_subdirs) (*n_subdirs)++;
 781        if (!de->first && !de->last && n_items) (*n_items)++;
 782        if ((de = de_next_de(de)) < dnode_end_de(dnode)) goto next_de;
 783        ptr = dno;
 784        dno = le32_to_cpu(dnode->up);
 785        if (dnode->root_dnode) {
 786                hpfs_brelse4(&qbh);
 787                return;
 788        }
 789        hpfs_brelse4(&qbh);
 790        if (hpfs_sb(s)->sb_chk)
 791                if (hpfs_stop_cycles(s, ptr, &d1, &d2, "hpfs_count_dnodes #2")) return;
 792        odno = -1;
 793        goto go_up;
 794}
 795
 796static struct hpfs_dirent *map_nth_dirent(struct super_block *s, dnode_secno dno, int n,
 797                                          struct quad_buffer_head *qbh, struct dnode **dn)
 798{
 799        int i;
 800        struct hpfs_dirent *de, *de_end;
 801        struct dnode *dnode;
 802        dnode = hpfs_map_dnode(s, dno, qbh);
 803        if (!dnode) return NULL;
 804        if (dn) *dn=dnode;
 805        de = dnode_first_de(dnode);
 806        de_end = dnode_end_de(dnode);
 807        for (i = 1; de < de_end; i++, de = de_next_de(de)) {
 808                if (i == n) {
 809                        return de;
 810                }       
 811                if (de->last) break;
 812        }
 813        hpfs_brelse4(qbh);
 814        hpfs_error(s, "map_nth_dirent: n too high; dnode = %08x, requested %08x", dno, n);
 815        return NULL;
 816}
 817
 818dnode_secno hpfs_de_as_down_as_possible(struct super_block *s, dnode_secno dno)
 819{
 820        struct quad_buffer_head qbh;
 821        dnode_secno d = dno;
 822        dnode_secno up = 0;
 823        struct hpfs_dirent *de;
 824        int c1, c2 = 0;
 825
 826        again:
 827        if (hpfs_sb(s)->sb_chk)
 828                if (hpfs_stop_cycles(s, d, &c1, &c2, "hpfs_de_as_down_as_possible"))
 829                        return d;
 830        if (!(de = map_nth_dirent(s, d, 1, &qbh, NULL))) return dno;
 831        if (hpfs_sb(s)->sb_chk)
 832                if (up && le32_to_cpu(((struct dnode *)qbh.data)->up) != up)
 833                        hpfs_error(s, "hpfs_de_as_down_as_possible: bad up pointer; dnode %08x, down %08x points to %08x", up, d, le32_to_cpu(((struct dnode *)qbh.data)->up));
 834        if (!de->down) {
 835                hpfs_brelse4(&qbh);
 836                return d;
 837        }
 838        up = d;
 839        d = de_down_pointer(de);
 840        hpfs_brelse4(&qbh);
 841        goto again;
 842}
 843
 844struct hpfs_dirent *map_pos_dirent(struct inode *inode, loff_t *posp,
 845                                   struct quad_buffer_head *qbh)
 846{
 847        loff_t pos;
 848        unsigned c;
 849        dnode_secno dno;
 850        struct hpfs_dirent *de, *d;
 851        struct hpfs_dirent *up_de;
 852        struct hpfs_dirent *end_up_de;
 853        struct dnode *dnode;
 854        struct dnode *up_dnode;
 855        struct quad_buffer_head qbh0;
 856
 857        pos = *posp;
 858        dno = pos >> 6 << 2;
 859        pos &= 077;
 860        if (!(de = map_nth_dirent(inode->i_sb, dno, pos, qbh, &dnode)))
 861                goto bail;
 862
 863        /* Going to the next dirent */
 864        if ((d = de_next_de(de)) < dnode_end_de(dnode)) {
 865                if (!(++*posp & 077)) {
 866                        hpfs_error(inode->i_sb,
 867                                "map_pos_dirent: pos crossed dnode boundary; pos = %08llx",
 868                                (unsigned long long)*posp);
 869                        goto bail;
 870                }
 871                /* We're going down the tree */
 872                if (d->down) {
 873                        *posp = ((loff_t) hpfs_de_as_down_as_possible(inode->i_sb, de_down_pointer(d)) << 4) + 1;
 874                }
 875        
 876                return de;
 877        }
 878
 879        /* Going up */
 880        if (dnode->root_dnode) goto bail;
 881
 882        if (!(up_dnode = hpfs_map_dnode(inode->i_sb, le32_to_cpu(dnode->up), &qbh0)))
 883                goto bail;
 884
 885        end_up_de = dnode_end_de(up_dnode);
 886        c = 0;
 887        for (up_de = dnode_first_de(up_dnode); up_de < end_up_de;
 888             up_de = de_next_de(up_de)) {
 889                if (!(++c & 077)) hpfs_error(inode->i_sb,
 890                        "map_pos_dirent: pos crossed dnode boundary; dnode = %08x", le32_to_cpu(dnode->up));
 891                if (up_de->down && de_down_pointer(up_de) == dno) {
 892                        *posp = ((loff_t) le32_to_cpu(dnode->up) << 4) + c;
 893                        hpfs_brelse4(&qbh0);
 894                        return de;
 895                }
 896        }
 897        
 898        hpfs_error(inode->i_sb, "map_pos_dirent: pointer to dnode %08x not found in parent dnode %08x",
 899                dno, le32_to_cpu(dnode->up));
 900        hpfs_brelse4(&qbh0);
 901        
 902        bail:
 903        *posp = 12;
 904        return de;
 905}
 906
 907/* Find a dirent in tree */
 908
 909struct hpfs_dirent *map_dirent(struct inode *inode, dnode_secno dno,
 910                               const unsigned char *name, unsigned len,
 911                               dnode_secno *dd, struct quad_buffer_head *qbh)
 912{
 913        struct dnode *dnode;
 914        struct hpfs_dirent *de;
 915        struct hpfs_dirent *de_end;
 916        int c1, c2 = 0;
 917
 918        if (!S_ISDIR(inode->i_mode)) hpfs_error(inode->i_sb, "map_dirent: not a directory\n");
 919        again:
 920        if (hpfs_sb(inode->i_sb)->sb_chk)
 921                if (hpfs_stop_cycles(inode->i_sb, dno, &c1, &c2, "map_dirent")) return NULL;
 922        if (!(dnode = hpfs_map_dnode(inode->i_sb, dno, qbh))) return NULL;
 923        
 924        de_end = dnode_end_de(dnode);
 925        for (de = dnode_first_de(dnode); de < de_end; de = de_next_de(de)) {
 926                int t = hpfs_compare_names(inode->i_sb, name, len, de->name, de->namelen, de->last);
 927                if (!t) {
 928                        if (dd) *dd = dno;
 929                        return de;
 930                }
 931                if (t < 0) {
 932                        if (de->down) {
 933                                dno = de_down_pointer(de);
 934                                hpfs_brelse4(qbh);
 935                                goto again;
 936                        }
 937                break;
 938                }
 939        }
 940        hpfs_brelse4(qbh);
 941        return NULL;
 942}
 943
 944/*
 945 * Remove empty directory. In normal cases it is only one dnode with two
 946 * entries, but we must handle also such obscure cases when it's a tree
 947 * of empty dnodes.
 948 */
 949
 950void hpfs_remove_dtree(struct super_block *s, dnode_secno dno)
 951{
 952        struct quad_buffer_head qbh;
 953        struct dnode *dnode;
 954        struct hpfs_dirent *de;
 955        dnode_secno d1, d2, rdno = dno;
 956        while (1) {
 957                if (!(dnode = hpfs_map_dnode(s, dno, &qbh))) return;
 958                de = dnode_first_de(dnode);
 959                if (de->last) {
 960                        if (de->down) d1 = de_down_pointer(de);
 961                        else goto error;
 962                        hpfs_brelse4(&qbh);
 963                        hpfs_free_dnode(s, dno);
 964                        dno = d1;
 965                } else break;
 966        }
 967        if (!de->first) goto error;
 968        d1 = de->down ? de_down_pointer(de) : 0;
 969        de = de_next_de(de);
 970        if (!de->last) goto error;
 971        d2 = de->down ? de_down_pointer(de) : 0;
 972        hpfs_brelse4(&qbh);
 973        hpfs_free_dnode(s, dno);
 974        do {
 975                while (d1) {
 976                        if (!(dnode = hpfs_map_dnode(s, dno = d1, &qbh))) return;
 977                        de = dnode_first_de(dnode);
 978                        if (!de->last) goto error;
 979                        d1 = de->down ? de_down_pointer(de) : 0;
 980                        hpfs_brelse4(&qbh);
 981                        hpfs_free_dnode(s, dno);
 982                }
 983                d1 = d2;
 984                d2 = 0;
 985        } while (d1);
 986        return;
 987        error:
 988        hpfs_brelse4(&qbh);
 989        hpfs_free_dnode(s, dno);
 990        hpfs_error(s, "directory %08x is corrupted or not empty", rdno);
 991}
 992
 993/* 
 994 * Find dirent for specified fnode. Use truncated 15-char name in fnode as
 995 * a help for searching.
 996 */
 997
 998struct hpfs_dirent *map_fnode_dirent(struct super_block *s, fnode_secno fno,
 999                                     struct fnode *f, struct quad_buffer_head *qbh)
1000{
1001        unsigned char *name1;
1002        unsigned char *name2;
1003        int name1len, name2len;
1004        struct dnode *d;
1005        dnode_secno dno, downd;
1006        struct fnode *upf;
1007        struct buffer_head *bh;
1008        struct hpfs_dirent *de, *de_end;
1009        int c;
1010        int c1, c2 = 0;
1011        int d1, d2 = 0;
1012        name1 = f->name;
1013        if (!(name2 = kmalloc(256, GFP_NOFS))) {
1014                pr_err("out of memory, can't map dirent\n");
1015                return NULL;
1016        }
1017        if (f->len <= 15)
1018                memcpy(name2, name1, name1len = name2len = f->len);
1019        else {
1020                memcpy(name2, name1, 15);
1021                memset(name2 + 15, 0xff, 256 - 15);
1022                /*name2[15] = 0xff;*/
1023                name1len = 15; name2len = 256;
1024        }
1025        if (!(upf = hpfs_map_fnode(s, le32_to_cpu(f->up), &bh))) {
1026                kfree(name2);
1027                return NULL;
1028        }       
1029        if (!fnode_is_dir(upf)) {
1030                brelse(bh);
1031                hpfs_error(s, "fnode %08x has non-directory parent %08x", fno, le32_to_cpu(f->up));
1032                kfree(name2);
1033                return NULL;
1034        }
1035        dno = le32_to_cpu(upf->u.external[0].disk_secno);
1036        brelse(bh);
1037        go_down:
1038        downd = 0;
1039        go_up:
1040        if (!(d = hpfs_map_dnode(s, dno, qbh))) {
1041                kfree(name2);
1042                return NULL;
1043        }
1044        de_end = dnode_end_de(d);
1045        de = dnode_first_de(d);
1046        if (downd) {
1047                while (de < de_end) {
1048                        if (de->down) if (de_down_pointer(de) == downd) goto f;
1049                        de = de_next_de(de);
1050                }
1051                hpfs_error(s, "pointer to dnode %08x not found in dnode %08x", downd, dno);
1052                hpfs_brelse4(qbh);
1053                kfree(name2);
1054                return NULL;
1055        }
1056        next_de:
1057        if (le32_to_cpu(de->fnode) == fno) {
1058                kfree(name2);
1059                return de;
1060        }
1061        c = hpfs_compare_names(s, name1, name1len, de->name, de->namelen, de->last);
1062        if (c < 0 && de->down) {
1063                dno = de_down_pointer(de);
1064                hpfs_brelse4(qbh);
1065                if (hpfs_sb(s)->sb_chk)
1066                        if (hpfs_stop_cycles(s, dno, &c1, &c2, "map_fnode_dirent #1")) {
1067                                kfree(name2);
1068                                return NULL;
1069                }
1070                goto go_down;
1071        }
1072        f:
1073        if (le32_to_cpu(de->fnode) == fno) {
1074                kfree(name2);
1075                return de;
1076        }
1077        c = hpfs_compare_names(s, name2, name2len, de->name, de->namelen, de->last);
1078        if (c < 0 && !de->last) goto not_found;
1079        if ((de = de_next_de(de)) < de_end) goto next_de;
1080        if (d->root_dnode) goto not_found;
1081        downd = dno;
1082        dno = le32_to_cpu(d->up);
1083        hpfs_brelse4(qbh);
1084        if (hpfs_sb(s)->sb_chk)
1085                if (hpfs_stop_cycles(s, downd, &d1, &d2, "map_fnode_dirent #2")) {
1086                        kfree(name2);
1087                        return NULL;
1088                }
1089        goto go_up;
1090        not_found:
1091        hpfs_brelse4(qbh);
1092        hpfs_error(s, "dirent for fnode %08x not found", fno);
1093        kfree(name2);
1094        return NULL;
1095}
1096