linux/fs/ocfs2/namei.c
<<
>>
Prefs
   1/* -*- mode: c; c-basic-offset: 8; -*-
   2 * vim: noexpandtab sw=8 ts=8 sts=0:
   3 *
   4 * namei.c
   5 *
   6 * Create and rename file, directory, symlinks
   7 *
   8 * Copyright (C) 2002, 2004 Oracle.  All rights reserved.
   9 *
  10 *  Portions of this code from linux/fs/ext3/dir.c
  11 *
  12 *  Copyright (C) 1992, 1993, 1994, 1995
  13 *  Remy Card (card@masi.ibp.fr)
  14 *  Laboratoire MASI - Institut Blaise pascal
  15 *  Universite Pierre et Marie Curie (Paris VI)
  16 *
  17 *   from
  18 *
  19 *   linux/fs/minix/dir.c
  20 *
  21 *   Copyright (C) 1991, 1992 Linux Torvalds
  22 *
  23 * This program is free software; you can redistribute it and/or
  24 * modify it under the terms of the GNU General Public
  25 * License as published by the Free Software Foundation; either
  26 * version 2 of the License, or (at your option) any later version.
  27 *
  28 * This program is distributed in the hope that it will be useful,
  29 * but WITHOUT ANY WARRANTY; without even the implied warranty of
  30 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  31 * General Public License for more details.
  32 *
  33 * You should have received a copy of the GNU General Public
  34 * License along with this program; if not, write to the
  35 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
  36 * Boston, MA 021110-1307, USA.
  37 */
  38
  39#include <linux/fs.h>
  40#include <linux/types.h>
  41#include <linux/slab.h>
  42#include <linux/highmem.h>
  43#include <linux/quotaops.h>
  44
  45#define MLOG_MASK_PREFIX ML_NAMEI
  46#include <cluster/masklog.h>
  47
  48#include "ocfs2.h"
  49
  50#include "alloc.h"
  51#include "dcache.h"
  52#include "dir.h"
  53#include "dlmglue.h"
  54#include "extent_map.h"
  55#include "file.h"
  56#include "inode.h"
  57#include "journal.h"
  58#include "namei.h"
  59#include "suballoc.h"
  60#include "super.h"
  61#include "symlink.h"
  62#include "sysfile.h"
  63#include "uptodate.h"
  64#include "xattr.h"
  65#include "acl.h"
  66
  67#include "buffer_head_io.h"
  68
  69static int ocfs2_mknod_locked(struct ocfs2_super *osb,
  70                              struct inode *dir,
  71                              struct inode *inode,
  72                              struct dentry *dentry,
  73                              dev_t dev,
  74                              struct buffer_head **new_fe_bh,
  75                              struct buffer_head *parent_fe_bh,
  76                              handle_t *handle,
  77                              struct ocfs2_alloc_context *inode_ac);
  78
  79static int ocfs2_prepare_orphan_dir(struct ocfs2_super *osb,
  80                                    struct inode **ret_orphan_dir,
  81                                    struct inode *inode,
  82                                    char *name,
  83                                    struct ocfs2_dir_lookup_result *lookup);
  84
  85static int ocfs2_orphan_add(struct ocfs2_super *osb,
  86                            handle_t *handle,
  87                            struct inode *inode,
  88                            struct ocfs2_dinode *fe,
  89                            char *name,
  90                            struct ocfs2_dir_lookup_result *lookup,
  91                            struct inode *orphan_dir_inode);
  92
  93static int ocfs2_create_symlink_data(struct ocfs2_super *osb,
  94                                     handle_t *handle,
  95                                     struct inode *inode,
  96                                     const char *symname);
  97
  98/* An orphan dir name is an 8 byte value, printed as a hex string */
  99#define OCFS2_ORPHAN_NAMELEN ((int)(2 * sizeof(u64)))
 100
 101static struct dentry *ocfs2_lookup(struct inode *dir, struct dentry *dentry,
 102                                   struct nameidata *nd)
 103{
 104        int status;
 105        u64 blkno;
 106        struct inode *inode = NULL;
 107        struct dentry *ret;
 108        struct ocfs2_inode_info *oi;
 109
 110        mlog_entry("(0x%p, 0x%p, '%.*s')\n", dir, dentry,
 111                   dentry->d_name.len, dentry->d_name.name);
 112
 113        if (dentry->d_name.len > OCFS2_MAX_FILENAME_LEN) {
 114                ret = ERR_PTR(-ENAMETOOLONG);
 115                goto bail;
 116        }
 117
 118        mlog(0, "find name %.*s in directory %llu\n", dentry->d_name.len,
 119             dentry->d_name.name, (unsigned long long)OCFS2_I(dir)->ip_blkno);
 120
 121        status = ocfs2_inode_lock(dir, NULL, 0);
 122        if (status < 0) {
 123                if (status != -ENOENT)
 124                        mlog_errno(status);
 125                ret = ERR_PTR(status);
 126                goto bail;
 127        }
 128
 129        status = ocfs2_lookup_ino_from_name(dir, dentry->d_name.name,
 130                                            dentry->d_name.len, &blkno);
 131        if (status < 0)
 132                goto bail_add;
 133
 134        inode = ocfs2_iget(OCFS2_SB(dir->i_sb), blkno, 0, 0);
 135        if (IS_ERR(inode)) {
 136                ret = ERR_PTR(-EACCES);
 137                goto bail_unlock;
 138        }
 139
 140        oi = OCFS2_I(inode);
 141        /* Clear any orphaned state... If we were able to look up the
 142         * inode from a directory, it certainly can't be orphaned. We
 143         * might have the bad state from a node which intended to
 144         * orphan this inode but crashed before it could commit the
 145         * unlink. */
 146        spin_lock(&oi->ip_lock);
 147        oi->ip_flags &= ~OCFS2_INODE_MAYBE_ORPHANED;
 148        spin_unlock(&oi->ip_lock);
 149
 150bail_add:
 151        dentry->d_op = &ocfs2_dentry_ops;
 152        ret = d_splice_alias(inode, dentry);
 153
 154        if (inode) {
 155                /*
 156                 * If d_splice_alias() finds a DCACHE_DISCONNECTED
 157                 * dentry, it will d_move() it on top of ourse. The
 158                 * return value will indicate this however, so in
 159                 * those cases, we switch them around for the locking
 160                 * code.
 161                 *
 162                 * NOTE: This dentry already has ->d_op set from
 163                 * ocfs2_get_parent() and ocfs2_get_dentry()
 164                 */
 165                if (ret)
 166                        dentry = ret;
 167
 168                status = ocfs2_dentry_attach_lock(dentry, inode,
 169                                                  OCFS2_I(dir)->ip_blkno);
 170                if (status) {
 171                        mlog_errno(status);
 172                        ret = ERR_PTR(status);
 173                        goto bail_unlock;
 174                }
 175        }
 176
 177bail_unlock:
 178        /* Don't drop the cluster lock until *after* the d_add --
 179         * unlink on another node will message us to remove that
 180         * dentry under this lock so otherwise we can race this with
 181         * the downconvert thread and have a stale dentry. */
 182        ocfs2_inode_unlock(dir, 0);
 183
 184bail:
 185
 186        mlog_exit_ptr(ret);
 187
 188        return ret;
 189}
 190
 191static struct inode *ocfs2_get_init_inode(struct inode *dir, int mode)
 192{
 193        struct inode *inode;
 194
 195        inode = new_inode(dir->i_sb);
 196        if (!inode) {
 197                mlog(ML_ERROR, "new_inode failed!\n");
 198                return NULL;
 199        }
 200
 201        /* populate as many fields early on as possible - many of
 202         * these are used by the support functions here and in
 203         * callers. */
 204        if (S_ISDIR(mode))
 205                inode->i_nlink = 2;
 206        else
 207                inode->i_nlink = 1;
 208        inode->i_uid = current_fsuid();
 209        if (dir->i_mode & S_ISGID) {
 210                inode->i_gid = dir->i_gid;
 211                if (S_ISDIR(mode))
 212                        mode |= S_ISGID;
 213        } else
 214                inode->i_gid = current_fsgid();
 215        inode->i_mode = mode;
 216        vfs_dq_init(inode);
 217        return inode;
 218}
 219
 220static int ocfs2_mknod(struct inode *dir,
 221                       struct dentry *dentry,
 222                       int mode,
 223                       dev_t dev)
 224{
 225        int status = 0;
 226        struct buffer_head *parent_fe_bh = NULL;
 227        handle_t *handle = NULL;
 228        struct ocfs2_super *osb;
 229        struct ocfs2_dinode *dirfe;
 230        struct buffer_head *new_fe_bh = NULL;
 231        struct inode *inode = NULL;
 232        struct ocfs2_alloc_context *inode_ac = NULL;
 233        struct ocfs2_alloc_context *data_ac = NULL;
 234        struct ocfs2_alloc_context *meta_ac = NULL;
 235        int want_clusters = 0;
 236        int want_meta = 0;
 237        int xattr_credits = 0;
 238        struct ocfs2_security_xattr_info si = {
 239                .enable = 1,
 240        };
 241        int did_quota_inode = 0;
 242        struct ocfs2_dir_lookup_result lookup = { NULL, };
 243
 244        mlog_entry("(0x%p, 0x%p, %d, %lu, '%.*s')\n", dir, dentry, mode,
 245                   (unsigned long)dev, dentry->d_name.len,
 246                   dentry->d_name.name);
 247
 248        /* get our super block */
 249        osb = OCFS2_SB(dir->i_sb);
 250
 251        status = ocfs2_inode_lock(dir, &parent_fe_bh, 1);
 252        if (status < 0) {
 253                if (status != -ENOENT)
 254                        mlog_errno(status);
 255                return status;
 256        }
 257
 258        if (S_ISDIR(mode) && (dir->i_nlink >= ocfs2_link_max(osb))) {
 259                status = -EMLINK;
 260                goto leave;
 261        }
 262
 263        dirfe = (struct ocfs2_dinode *) parent_fe_bh->b_data;
 264        if (!ocfs2_read_links_count(dirfe)) {
 265                /* can't make a file in a deleted directory. */
 266                status = -ENOENT;
 267                goto leave;
 268        }
 269
 270        status = ocfs2_check_dir_for_entry(dir, dentry->d_name.name,
 271                                           dentry->d_name.len);
 272        if (status)
 273                goto leave;
 274
 275        /* get a spot inside the dir. */
 276        status = ocfs2_prepare_dir_for_insert(osb, dir, parent_fe_bh,
 277                                              dentry->d_name.name,
 278                                              dentry->d_name.len, &lookup);
 279        if (status < 0) {
 280                mlog_errno(status);
 281                goto leave;
 282        }
 283
 284        /* reserve an inode spot */
 285        status = ocfs2_reserve_new_inode(osb, &inode_ac);
 286        if (status < 0) {
 287                if (status != -ENOSPC)
 288                        mlog_errno(status);
 289                goto leave;
 290        }
 291
 292        inode = ocfs2_get_init_inode(dir, mode);
 293        if (!inode) {
 294                status = -ENOMEM;
 295                mlog_errno(status);
 296                goto leave;
 297        }
 298
 299        /* get security xattr */
 300        status = ocfs2_init_security_get(inode, dir, &si);
 301        if (status) {
 302                if (status == -EOPNOTSUPP)
 303                        si.enable = 0;
 304                else {
 305                        mlog_errno(status);
 306                        goto leave;
 307                }
 308        }
 309
 310        /* calculate meta data/clusters for setting security and acl xattr */
 311        status = ocfs2_calc_xattr_init(dir, parent_fe_bh, mode,
 312                                       &si, &want_clusters,
 313                                       &xattr_credits, &want_meta);
 314        if (status < 0) {
 315                mlog_errno(status);
 316                goto leave;
 317        }
 318
 319        /* Reserve a cluster if creating an extent based directory. */
 320        if (S_ISDIR(mode) && !ocfs2_supports_inline_data(osb)) {
 321                want_clusters += 1;
 322
 323                /* Dir indexing requires extra space as well */
 324                if (ocfs2_supports_indexed_dirs(osb))
 325                        want_meta++;
 326        }
 327
 328        status = ocfs2_reserve_new_metadata_blocks(osb, want_meta, &meta_ac);
 329        if (status < 0) {
 330                if (status != -ENOSPC)
 331                        mlog_errno(status);
 332                goto leave;
 333        }
 334
 335        status = ocfs2_reserve_clusters(osb, want_clusters, &data_ac);
 336        if (status < 0) {
 337                if (status != -ENOSPC)
 338                        mlog_errno(status);
 339                goto leave;
 340        }
 341
 342        handle = ocfs2_start_trans(osb, ocfs2_mknod_credits(osb->sb,
 343                                                            S_ISDIR(mode),
 344                                                            xattr_credits));
 345        if (IS_ERR(handle)) {
 346                status = PTR_ERR(handle);
 347                handle = NULL;
 348                mlog_errno(status);
 349                goto leave;
 350        }
 351
 352        /* We don't use standard VFS wrapper because we don't want vfs_dq_init
 353         * to be called. */
 354        if (sb_any_quota_active(osb->sb) &&
 355            osb->sb->dq_op->alloc_inode(inode, 1) == NO_QUOTA) {
 356                status = -EDQUOT;
 357                goto leave;
 358        }
 359        did_quota_inode = 1;
 360
 361        /* do the real work now. */
 362        status = ocfs2_mknod_locked(osb, dir, inode, dentry, dev,
 363                                    &new_fe_bh, parent_fe_bh, handle,
 364                                    inode_ac);
 365        if (status < 0) {
 366                mlog_errno(status);
 367                goto leave;
 368        }
 369
 370        if (S_ISDIR(mode)) {
 371                status = ocfs2_fill_new_dir(osb, handle, dir, inode,
 372                                            new_fe_bh, data_ac, meta_ac);
 373                if (status < 0) {
 374                        mlog_errno(status);
 375                        goto leave;
 376                }
 377
 378                status = ocfs2_journal_access_di(handle, dir, parent_fe_bh,
 379                                                 OCFS2_JOURNAL_ACCESS_WRITE);
 380                if (status < 0) {
 381                        mlog_errno(status);
 382                        goto leave;
 383                }
 384                ocfs2_add_links_count(dirfe, 1);
 385                status = ocfs2_journal_dirty(handle, parent_fe_bh);
 386                if (status < 0) {
 387                        mlog_errno(status);
 388                        goto leave;
 389                }
 390                inc_nlink(dir);
 391        }
 392
 393        status = ocfs2_init_acl(handle, inode, dir, new_fe_bh, parent_fe_bh,
 394                                meta_ac, data_ac);
 395        if (status < 0) {
 396                mlog_errno(status);
 397                goto leave;
 398        }
 399
 400        if (si.enable) {
 401                status = ocfs2_init_security_set(handle, inode, new_fe_bh, &si,
 402                                                 meta_ac, data_ac);
 403                if (status < 0) {
 404                        mlog_errno(status);
 405                        goto leave;
 406                }
 407        }
 408
 409        status = ocfs2_add_entry(handle, dentry, inode,
 410                                 OCFS2_I(inode)->ip_blkno, parent_fe_bh,
 411                                 &lookup);
 412        if (status < 0) {
 413                mlog_errno(status);
 414                goto leave;
 415        }
 416
 417        status = ocfs2_dentry_attach_lock(dentry, inode,
 418                                          OCFS2_I(dir)->ip_blkno);
 419        if (status) {
 420                mlog_errno(status);
 421                goto leave;
 422        }
 423
 424        insert_inode_hash(inode);
 425        dentry->d_op = &ocfs2_dentry_ops;
 426        d_instantiate(dentry, inode);
 427        status = 0;
 428leave:
 429        if (status < 0 && did_quota_inode)
 430                vfs_dq_free_inode(inode);
 431        if (handle)
 432                ocfs2_commit_trans(osb, handle);
 433
 434        ocfs2_inode_unlock(dir, 1);
 435
 436        if (status == -ENOSPC)
 437                mlog(0, "Disk is full\n");
 438
 439        brelse(new_fe_bh);
 440        brelse(parent_fe_bh);
 441        kfree(si.name);
 442        kfree(si.value);
 443
 444        ocfs2_free_dir_lookup_result(&lookup);
 445
 446        if ((status < 0) && inode) {
 447                clear_nlink(inode);
 448                iput(inode);
 449        }
 450
 451        if (inode_ac)
 452                ocfs2_free_alloc_context(inode_ac);
 453
 454        if (data_ac)
 455                ocfs2_free_alloc_context(data_ac);
 456
 457        if (meta_ac)
 458                ocfs2_free_alloc_context(meta_ac);
 459
 460        mlog_exit(status);
 461
 462        return status;
 463}
 464
 465static int ocfs2_mknod_locked(struct ocfs2_super *osb,
 466                              struct inode *dir,
 467                              struct inode *inode,
 468                              struct dentry *dentry,
 469                              dev_t dev,
 470                              struct buffer_head **new_fe_bh,
 471                              struct buffer_head *parent_fe_bh,
 472                              handle_t *handle,
 473                              struct ocfs2_alloc_context *inode_ac)
 474{
 475        int status = 0;
 476        struct ocfs2_dinode *fe = NULL;
 477        struct ocfs2_extent_list *fel;
 478        u64 fe_blkno = 0;
 479        u16 suballoc_bit;
 480        u16 feat;
 481
 482        mlog_entry("(0x%p, 0x%p, %d, %lu, '%.*s')\n", dir, dentry,
 483                   inode->i_mode, (unsigned long)dev, dentry->d_name.len,
 484                   dentry->d_name.name);
 485
 486        *new_fe_bh = NULL;
 487
 488        status = ocfs2_claim_new_inode(osb, handle, dir, parent_fe_bh,
 489                                       inode_ac, &suballoc_bit, &fe_blkno);
 490        if (status < 0) {
 491                mlog_errno(status);
 492                goto leave;
 493        }
 494
 495        /* populate as many fields early on as possible - many of
 496         * these are used by the support functions here and in
 497         * callers. */
 498        inode->i_ino = ino_from_blkno(osb->sb, fe_blkno);
 499        OCFS2_I(inode)->ip_blkno = fe_blkno;
 500        spin_lock(&osb->osb_lock);
 501        inode->i_generation = osb->s_next_generation++;
 502        spin_unlock(&osb->osb_lock);
 503
 504        *new_fe_bh = sb_getblk(osb->sb, fe_blkno);
 505        if (!*new_fe_bh) {
 506                status = -EIO;
 507                mlog_errno(status);
 508                goto leave;
 509        }
 510        ocfs2_set_new_buffer_uptodate(inode, *new_fe_bh);
 511
 512        status = ocfs2_journal_access_di(handle, inode, *new_fe_bh,
 513                                         OCFS2_JOURNAL_ACCESS_CREATE);
 514        if (status < 0) {
 515                mlog_errno(status);
 516                goto leave;
 517        }
 518
 519        fe = (struct ocfs2_dinode *) (*new_fe_bh)->b_data;
 520        memset(fe, 0, osb->sb->s_blocksize);
 521
 522        fe->i_generation = cpu_to_le32(inode->i_generation);
 523        fe->i_fs_generation = cpu_to_le32(osb->fs_generation);
 524        fe->i_blkno = cpu_to_le64(fe_blkno);
 525        fe->i_suballoc_bit = cpu_to_le16(suballoc_bit);
 526        fe->i_suballoc_slot = cpu_to_le16(inode_ac->ac_alloc_slot);
 527        fe->i_uid = cpu_to_le32(inode->i_uid);
 528        fe->i_gid = cpu_to_le32(inode->i_gid);
 529        fe->i_mode = cpu_to_le16(inode->i_mode);
 530        if (S_ISCHR(inode->i_mode) || S_ISBLK(inode->i_mode))
 531                fe->id1.dev1.i_rdev = cpu_to_le64(huge_encode_dev(dev));
 532
 533        ocfs2_set_links_count(fe, inode->i_nlink);
 534
 535        fe->i_last_eb_blk = 0;
 536        strcpy(fe->i_signature, OCFS2_INODE_SIGNATURE);
 537        le32_add_cpu(&fe->i_flags, OCFS2_VALID_FL);
 538        fe->i_atime = fe->i_ctime = fe->i_mtime =
 539                cpu_to_le64(CURRENT_TIME.tv_sec);
 540        fe->i_mtime_nsec = fe->i_ctime_nsec = fe->i_atime_nsec =
 541                cpu_to_le32(CURRENT_TIME.tv_nsec);
 542        fe->i_dtime = 0;
 543
 544        /*
 545         * If supported, directories start with inline data. If inline
 546         * isn't supported, but indexing is, we start them as indexed.
 547         */
 548        feat = le16_to_cpu(fe->i_dyn_features);
 549        if (S_ISDIR(inode->i_mode) && ocfs2_supports_inline_data(osb)) {
 550                fe->i_dyn_features = cpu_to_le16(feat | OCFS2_INLINE_DATA_FL);
 551
 552                fe->id2.i_data.id_count = cpu_to_le16(
 553                                ocfs2_max_inline_data_with_xattr(osb->sb, fe));
 554        } else {
 555                fel = &fe->id2.i_list;
 556                fel->l_tree_depth = 0;
 557                fel->l_next_free_rec = 0;
 558                fel->l_count = cpu_to_le16(ocfs2_extent_recs_per_inode(osb->sb));
 559        }
 560
 561        status = ocfs2_journal_dirty(handle, *new_fe_bh);
 562        if (status < 0) {
 563                mlog_errno(status);
 564                goto leave;
 565        }
 566
 567        ocfs2_populate_inode(inode, fe, 1);
 568        ocfs2_inode_set_new(osb, inode);
 569        if (!ocfs2_mount_local(osb)) {
 570                status = ocfs2_create_new_inode_locks(inode);
 571                if (status < 0)
 572                        mlog_errno(status);
 573        }
 574
 575        status = 0; /* error in ocfs2_create_new_inode_locks is not
 576                     * critical */
 577
 578leave:
 579        if (status < 0) {
 580                if (*new_fe_bh) {
 581                        brelse(*new_fe_bh);
 582                        *new_fe_bh = NULL;
 583                }
 584        }
 585
 586        mlog_exit(status);
 587        return status;
 588}
 589
 590static int ocfs2_mkdir(struct inode *dir,
 591                       struct dentry *dentry,
 592                       int mode)
 593{
 594        int ret;
 595
 596        mlog_entry("(0x%p, 0x%p, %d, '%.*s')\n", dir, dentry, mode,
 597                   dentry->d_name.len, dentry->d_name.name);
 598        ret = ocfs2_mknod(dir, dentry, mode | S_IFDIR, 0);
 599        mlog_exit(ret);
 600
 601        return ret;
 602}
 603
 604static int ocfs2_create(struct inode *dir,
 605                        struct dentry *dentry,
 606                        int mode,
 607                        struct nameidata *nd)
 608{
 609        int ret;
 610
 611        mlog_entry("(0x%p, 0x%p, %d, '%.*s')\n", dir, dentry, mode,
 612                   dentry->d_name.len, dentry->d_name.name);
 613        ret = ocfs2_mknod(dir, dentry, mode | S_IFREG, 0);
 614        mlog_exit(ret);
 615
 616        return ret;
 617}
 618
 619static int ocfs2_link(struct dentry *old_dentry,
 620                      struct inode *dir,
 621                      struct dentry *dentry)
 622{
 623        handle_t *handle;
 624        struct inode *inode = old_dentry->d_inode;
 625        int err;
 626        struct buffer_head *fe_bh = NULL;
 627        struct buffer_head *parent_fe_bh = NULL;
 628        struct ocfs2_dinode *fe = NULL;
 629        struct ocfs2_super *osb = OCFS2_SB(dir->i_sb);
 630        struct ocfs2_dir_lookup_result lookup = { NULL, };
 631
 632        mlog_entry("(inode=%lu, old='%.*s' new='%.*s')\n", inode->i_ino,
 633                   old_dentry->d_name.len, old_dentry->d_name.name,
 634                   dentry->d_name.len, dentry->d_name.name);
 635
 636        if (S_ISDIR(inode->i_mode))
 637                return -EPERM;
 638
 639        err = ocfs2_inode_lock(dir, &parent_fe_bh, 1);
 640        if (err < 0) {
 641                if (err != -ENOENT)
 642                        mlog_errno(err);
 643                return err;
 644        }
 645
 646        if (!dir->i_nlink) {
 647                err = -ENOENT;
 648                goto out;
 649        }
 650
 651        err = ocfs2_check_dir_for_entry(dir, dentry->d_name.name,
 652                                        dentry->d_name.len);
 653        if (err)
 654                goto out;
 655
 656        err = ocfs2_prepare_dir_for_insert(osb, dir, parent_fe_bh,
 657                                           dentry->d_name.name,
 658                                           dentry->d_name.len, &lookup);
 659        if (err < 0) {
 660                mlog_errno(err);
 661                goto out;
 662        }
 663
 664        err = ocfs2_inode_lock(inode, &fe_bh, 1);
 665        if (err < 0) {
 666                if (err != -ENOENT)
 667                        mlog_errno(err);
 668                goto out;
 669        }
 670
 671        fe = (struct ocfs2_dinode *) fe_bh->b_data;
 672        if (ocfs2_read_links_count(fe) >= ocfs2_link_max(osb)) {
 673                err = -EMLINK;
 674                goto out_unlock_inode;
 675        }
 676
 677        handle = ocfs2_start_trans(osb, ocfs2_link_credits(osb->sb));
 678        if (IS_ERR(handle)) {
 679                err = PTR_ERR(handle);
 680                handle = NULL;
 681                mlog_errno(err);
 682                goto out_unlock_inode;
 683        }
 684
 685        err = ocfs2_journal_access_di(handle, inode, fe_bh,
 686                                      OCFS2_JOURNAL_ACCESS_WRITE);
 687        if (err < 0) {
 688                mlog_errno(err);
 689                goto out_commit;
 690        }
 691
 692        inc_nlink(inode);
 693        inode->i_ctime = CURRENT_TIME;
 694        ocfs2_set_links_count(fe, inode->i_nlink);
 695        fe->i_ctime = cpu_to_le64(inode->i_ctime.tv_sec);
 696        fe->i_ctime_nsec = cpu_to_le32(inode->i_ctime.tv_nsec);
 697
 698        err = ocfs2_journal_dirty(handle, fe_bh);
 699        if (err < 0) {
 700                ocfs2_add_links_count(fe, -1);
 701                drop_nlink(inode);
 702                mlog_errno(err);
 703                goto out_commit;
 704        }
 705
 706        err = ocfs2_add_entry(handle, dentry, inode,
 707                              OCFS2_I(inode)->ip_blkno,
 708                              parent_fe_bh, &lookup);
 709        if (err) {
 710                ocfs2_add_links_count(fe, -1);
 711                drop_nlink(inode);
 712                mlog_errno(err);
 713                goto out_commit;
 714        }
 715
 716        err = ocfs2_dentry_attach_lock(dentry, inode, OCFS2_I(dir)->ip_blkno);
 717        if (err) {
 718                mlog_errno(err);
 719                goto out_commit;
 720        }
 721
 722        atomic_inc(&inode->i_count);
 723        dentry->d_op = &ocfs2_dentry_ops;
 724        d_instantiate(dentry, inode);
 725
 726out_commit:
 727        ocfs2_commit_trans(osb, handle);
 728out_unlock_inode:
 729        ocfs2_inode_unlock(inode, 1);
 730
 731out:
 732        ocfs2_inode_unlock(dir, 1);
 733
 734        brelse(fe_bh);
 735        brelse(parent_fe_bh);
 736
 737        ocfs2_free_dir_lookup_result(&lookup);
 738
 739        mlog_exit(err);
 740
 741        return err;
 742}
 743
 744/*
 745 * Takes and drops an exclusive lock on the given dentry. This will
 746 * force other nodes to drop it.
 747 */
 748static int ocfs2_remote_dentry_delete(struct dentry *dentry)
 749{
 750        int ret;
 751
 752        ret = ocfs2_dentry_lock(dentry, 1);
 753        if (ret)
 754                mlog_errno(ret);
 755        else
 756                ocfs2_dentry_unlock(dentry, 1);
 757
 758        return ret;
 759}
 760
 761static inline int inode_is_unlinkable(struct inode *inode)
 762{
 763        if (S_ISDIR(inode->i_mode)) {
 764                if (inode->i_nlink == 2)
 765                        return 1;
 766                return 0;
 767        }
 768
 769        if (inode->i_nlink == 1)
 770                return 1;
 771        return 0;
 772}
 773
 774static int ocfs2_unlink(struct inode *dir,
 775                        struct dentry *dentry)
 776{
 777        int status;
 778        int child_locked = 0;
 779        struct inode *inode = dentry->d_inode;
 780        struct inode *orphan_dir = NULL;
 781        struct ocfs2_super *osb = OCFS2_SB(dir->i_sb);
 782        u64 blkno;
 783        struct ocfs2_dinode *fe = NULL;
 784        struct buffer_head *fe_bh = NULL;
 785        struct buffer_head *parent_node_bh = NULL;
 786        handle_t *handle = NULL;
 787        char orphan_name[OCFS2_ORPHAN_NAMELEN + 1];
 788        struct ocfs2_dir_lookup_result lookup = { NULL, };
 789        struct ocfs2_dir_lookup_result orphan_insert = { NULL, };
 790
 791        mlog_entry("(0x%p, 0x%p, '%.*s')\n", dir, dentry,
 792                   dentry->d_name.len, dentry->d_name.name);
 793
 794        BUG_ON(dentry->d_parent->d_inode != dir);
 795
 796        mlog(0, "ino = %llu\n", (unsigned long long)OCFS2_I(inode)->ip_blkno);
 797
 798        if (inode == osb->root_inode) {
 799                mlog(0, "Cannot delete the root directory\n");
 800                return -EPERM;
 801        }
 802
 803        status = ocfs2_inode_lock(dir, &parent_node_bh, 1);
 804        if (status < 0) {
 805                if (status != -ENOENT)
 806                        mlog_errno(status);
 807                return status;
 808        }
 809
 810        status = ocfs2_find_files_on_disk(dentry->d_name.name,
 811                                          dentry->d_name.len, &blkno, dir,
 812                                          &lookup);
 813        if (status < 0) {
 814                if (status != -ENOENT)
 815                        mlog_errno(status);
 816                goto leave;
 817        }
 818
 819        if (OCFS2_I(inode)->ip_blkno != blkno) {
 820                status = -ENOENT;
 821
 822                mlog(0, "ip_blkno %llu != dirent blkno %llu ip_flags = %x\n",
 823                     (unsigned long long)OCFS2_I(inode)->ip_blkno,
 824                     (unsigned long long)blkno, OCFS2_I(inode)->ip_flags);
 825                goto leave;
 826        }
 827
 828        status = ocfs2_inode_lock(inode, &fe_bh, 1);
 829        if (status < 0) {
 830                if (status != -ENOENT)
 831                        mlog_errno(status);
 832                goto leave;
 833        }
 834        child_locked = 1;
 835
 836        if (S_ISDIR(inode->i_mode)) {
 837                if (inode->i_nlink != 2 || !ocfs2_empty_dir(inode)) {
 838                        status = -ENOTEMPTY;
 839                        goto leave;
 840                }
 841        }
 842
 843        status = ocfs2_remote_dentry_delete(dentry);
 844        if (status < 0) {
 845                /* This remote delete should succeed under all normal
 846                 * circumstances. */
 847                mlog_errno(status);
 848                goto leave;
 849        }
 850
 851        if (inode_is_unlinkable(inode)) {
 852                status = ocfs2_prepare_orphan_dir(osb, &orphan_dir, inode,
 853                                                  orphan_name, &orphan_insert);
 854                if (status < 0) {
 855                        mlog_errno(status);
 856                        goto leave;
 857                }
 858        }
 859
 860        handle = ocfs2_start_trans(osb, ocfs2_unlink_credits(osb->sb));
 861        if (IS_ERR(handle)) {
 862                status = PTR_ERR(handle);
 863                handle = NULL;
 864                mlog_errno(status);
 865                goto leave;
 866        }
 867
 868        status = ocfs2_journal_access_di(handle, inode, fe_bh,
 869                                         OCFS2_JOURNAL_ACCESS_WRITE);
 870        if (status < 0) {
 871                mlog_errno(status);
 872                goto leave;
 873        }
 874
 875        fe = (struct ocfs2_dinode *) fe_bh->b_data;
 876
 877        if (inode_is_unlinkable(inode)) {
 878                status = ocfs2_orphan_add(osb, handle, inode, fe, orphan_name,
 879                                          &orphan_insert, orphan_dir);
 880                if (status < 0) {
 881                        mlog_errno(status);
 882                        goto leave;
 883                }
 884        }
 885
 886        /* delete the name from the parent dir */
 887        status = ocfs2_delete_entry(handle, dir, &lookup);
 888        if (status < 0) {
 889                mlog_errno(status);
 890                goto leave;
 891        }
 892
 893        if (S_ISDIR(inode->i_mode))
 894                drop_nlink(inode);
 895        drop_nlink(inode);
 896        ocfs2_set_links_count(fe, inode->i_nlink);
 897
 898        status = ocfs2_journal_dirty(handle, fe_bh);
 899        if (status < 0) {
 900                mlog_errno(status);
 901                goto leave;
 902        }
 903
 904        dir->i_ctime = dir->i_mtime = CURRENT_TIME;
 905        if (S_ISDIR(inode->i_mode))
 906                drop_nlink(dir);
 907
 908        status = ocfs2_mark_inode_dirty(handle, dir, parent_node_bh);
 909        if (status < 0) {
 910                mlog_errno(status);
 911                if (S_ISDIR(inode->i_mode))
 912                        inc_nlink(dir);
 913        }
 914
 915leave:
 916        if (handle)
 917                ocfs2_commit_trans(osb, handle);
 918
 919        if (child_locked)
 920                ocfs2_inode_unlock(inode, 1);
 921
 922        ocfs2_inode_unlock(dir, 1);
 923
 924        if (orphan_dir) {
 925                /* This was locked for us in ocfs2_prepare_orphan_dir() */
 926                ocfs2_inode_unlock(orphan_dir, 1);
 927                mutex_unlock(&orphan_dir->i_mutex);
 928                iput(orphan_dir);
 929        }
 930
 931        brelse(fe_bh);
 932        brelse(parent_node_bh);
 933
 934        ocfs2_free_dir_lookup_result(&orphan_insert);
 935        ocfs2_free_dir_lookup_result(&lookup);
 936
 937        mlog_exit(status);
 938
 939        return status;
 940}
 941
 942/*
 943 * The only place this should be used is rename!
 944 * if they have the same id, then the 1st one is the only one locked.
 945 */
 946static int ocfs2_double_lock(struct ocfs2_super *osb,
 947                             struct buffer_head **bh1,
 948                             struct inode *inode1,
 949                             struct buffer_head **bh2,
 950                             struct inode *inode2)
 951{
 952        int status;
 953        struct ocfs2_inode_info *oi1 = OCFS2_I(inode1);
 954        struct ocfs2_inode_info *oi2 = OCFS2_I(inode2);
 955        struct buffer_head **tmpbh;
 956        struct inode *tmpinode;
 957
 958        mlog_entry("(inode1 = %llu, inode2 = %llu)\n",
 959                   (unsigned long long)oi1->ip_blkno,
 960                   (unsigned long long)oi2->ip_blkno);
 961
 962        if (*bh1)
 963                *bh1 = NULL;
 964        if (*bh2)
 965                *bh2 = NULL;
 966
 967        /* we always want to lock the one with the lower lockid first. */
 968        if (oi1->ip_blkno != oi2->ip_blkno) {
 969                if (oi1->ip_blkno < oi2->ip_blkno) {
 970                        /* switch id1 and id2 around */
 971                        mlog(0, "switching them around...\n");
 972                        tmpbh = bh2;
 973                        bh2 = bh1;
 974                        bh1 = tmpbh;
 975
 976                        tmpinode = inode2;
 977                        inode2 = inode1;
 978                        inode1 = tmpinode;
 979                }
 980                /* lock id2 */
 981                status = ocfs2_inode_lock(inode2, bh2, 1);
 982                if (status < 0) {
 983                        if (status != -ENOENT)
 984                                mlog_errno(status);
 985                        goto bail;
 986                }
 987        }
 988
 989        /* lock id1 */
 990        status = ocfs2_inode_lock(inode1, bh1, 1);
 991        if (status < 0) {
 992                /*
 993                 * An error return must mean that no cluster locks
 994                 * were held on function exit.
 995                 */
 996                if (oi1->ip_blkno != oi2->ip_blkno)
 997                        ocfs2_inode_unlock(inode2, 1);
 998
 999                if (status != -ENOENT)
1000                        mlog_errno(status);
1001        }
1002
1003bail:
1004        mlog_exit(status);
1005        return status;
1006}
1007
1008static void ocfs2_double_unlock(struct inode *inode1, struct inode *inode2)
1009{
1010        ocfs2_inode_unlock(inode1, 1);
1011
1012        if (inode1 != inode2)
1013                ocfs2_inode_unlock(inode2, 1);
1014}
1015
1016static int ocfs2_rename(struct inode *old_dir,
1017                        struct dentry *old_dentry,
1018                        struct inode *new_dir,
1019                        struct dentry *new_dentry)
1020{
1021        int status = 0, rename_lock = 0, parents_locked = 0, target_exists = 0;
1022        int old_child_locked = 0, new_child_locked = 0, update_dot_dot = 0;
1023        struct inode *old_inode = old_dentry->d_inode;
1024        struct inode *new_inode = new_dentry->d_inode;
1025        struct inode *orphan_dir = NULL;
1026        struct ocfs2_dinode *newfe = NULL;
1027        char orphan_name[OCFS2_ORPHAN_NAMELEN + 1];
1028        struct buffer_head *newfe_bh = NULL;
1029        struct buffer_head *old_inode_bh = NULL;
1030        struct ocfs2_super *osb = NULL;
1031        u64 newfe_blkno, old_de_ino;
1032        handle_t *handle = NULL;
1033        struct buffer_head *old_dir_bh = NULL;
1034        struct buffer_head *new_dir_bh = NULL;
1035        nlink_t old_dir_nlink = old_dir->i_nlink;
1036        struct ocfs2_dinode *old_di;
1037        struct ocfs2_dir_lookup_result old_inode_dot_dot_res = { NULL, };
1038        struct ocfs2_dir_lookup_result target_lookup_res = { NULL, };
1039        struct ocfs2_dir_lookup_result old_entry_lookup = { NULL, };
1040        struct ocfs2_dir_lookup_result orphan_insert = { NULL, };
1041        struct ocfs2_dir_lookup_result target_insert = { NULL, };
1042
1043        /* At some point it might be nice to break this function up a
1044         * bit. */
1045
1046        mlog_entry("(0x%p, 0x%p, 0x%p, 0x%p, from='%.*s' to='%.*s')\n",
1047                   old_dir, old_dentry, new_dir, new_dentry,
1048                   old_dentry->d_name.len, old_dentry->d_name.name,
1049                   new_dentry->d_name.len, new_dentry->d_name.name);
1050
1051        osb = OCFS2_SB(old_dir->i_sb);
1052
1053        if (new_inode) {
1054                if (!igrab(new_inode))
1055                        BUG();
1056        }
1057
1058        /* Assume a directory hierarchy thusly:
1059         * a/b/c
1060         * a/d
1061         * a,b,c, and d are all directories.
1062         *
1063         * from cwd of 'a' on both nodes:
1064         * node1: mv b/c d
1065         * node2: mv d   b/c
1066         *
1067         * And that's why, just like the VFS, we need a file system
1068         * rename lock. */
1069        if (old_dir != new_dir && S_ISDIR(old_inode->i_mode)) {
1070                status = ocfs2_rename_lock(osb);
1071                if (status < 0) {
1072                        mlog_errno(status);
1073                        goto bail;
1074                }
1075                rename_lock = 1;
1076        }
1077
1078        /* if old and new are the same, this'll just do one lock. */
1079        status = ocfs2_double_lock(osb, &old_dir_bh, old_dir,
1080                                   &new_dir_bh, new_dir);
1081        if (status < 0) {
1082                mlog_errno(status);
1083                goto bail;
1084        }
1085        parents_locked = 1;
1086
1087        /* make sure both dirs have bhs
1088         * get an extra ref on old_dir_bh if old==new */
1089        if (!new_dir_bh) {
1090                if (old_dir_bh) {
1091                        new_dir_bh = old_dir_bh;
1092                        get_bh(new_dir_bh);
1093                } else {
1094                        mlog(ML_ERROR, "no old_dir_bh!\n");
1095                        status = -EIO;
1096                        goto bail;
1097                }
1098        }
1099
1100        /*
1101         * Aside from allowing a meta data update, the locking here
1102         * also ensures that the downconvert thread on other nodes
1103         * won't have to concurrently downconvert the inode and the
1104         * dentry locks.
1105         */
1106        status = ocfs2_inode_lock(old_inode, &old_inode_bh, 1);
1107        if (status < 0) {
1108                if (status != -ENOENT)
1109                        mlog_errno(status);
1110                goto bail;
1111        }
1112        old_child_locked = 1;
1113
1114        status = ocfs2_remote_dentry_delete(old_dentry);
1115        if (status < 0) {
1116                mlog_errno(status);
1117                goto bail;
1118        }
1119
1120        if (S_ISDIR(old_inode->i_mode)) {
1121                u64 old_inode_parent;
1122
1123                update_dot_dot = 1;
1124                status = ocfs2_find_files_on_disk("..", 2, &old_inode_parent,
1125                                                  old_inode,
1126                                                  &old_inode_dot_dot_res);
1127                if (status) {
1128                        status = -EIO;
1129                        goto bail;
1130                }
1131
1132                if (old_inode_parent != OCFS2_I(old_dir)->ip_blkno) {
1133                        status = -EIO;
1134                        goto bail;
1135                }
1136
1137                if (!new_inode && new_dir != old_dir &&
1138                    new_dir->i_nlink >= ocfs2_link_max(osb)) {
1139                        status = -EMLINK;
1140                        goto bail;
1141                }
1142        }
1143
1144        status = ocfs2_lookup_ino_from_name(old_dir, old_dentry->d_name.name,
1145                                            old_dentry->d_name.len,
1146                                            &old_de_ino);
1147        if (status) {
1148                status = -ENOENT;
1149                goto bail;
1150        }
1151
1152        /*
1153         *  Check for inode number is _not_ due to possible IO errors.
1154         *  We might rmdir the source, keep it as pwd of some process
1155         *  and merrily kill the link to whatever was created under the
1156         *  same name. Goodbye sticky bit ;-<
1157         */
1158        if (old_de_ino != OCFS2_I(old_inode)->ip_blkno) {
1159                status = -ENOENT;
1160                goto bail;
1161        }
1162
1163        /* check if the target already exists (in which case we need
1164         * to delete it */
1165        status = ocfs2_find_files_on_disk(new_dentry->d_name.name,
1166                                          new_dentry->d_name.len,
1167                                          &newfe_blkno, new_dir,
1168                                          &target_lookup_res);
1169        /* The only error we allow here is -ENOENT because the new
1170         * file not existing is perfectly valid. */
1171        if ((status < 0) && (status != -ENOENT)) {
1172                /* If we cannot find the file specified we should just */
1173                /* return the error... */
1174                mlog_errno(status);
1175                goto bail;
1176        }
1177        if (status == 0)
1178                target_exists = 1;
1179
1180        if (!target_exists && new_inode) {
1181                /*
1182                 * Target was unlinked by another node while we were
1183                 * waiting to get to ocfs2_rename(). There isn't
1184                 * anything we can do here to help the situation, so
1185                 * bubble up the appropriate error.
1186                 */
1187                status = -ENOENT;
1188                goto bail;
1189        }
1190
1191        /* In case we need to overwrite an existing file, we blow it
1192         * away first */
1193        if (target_exists) {
1194                /* VFS didn't think there existed an inode here, but
1195                 * someone else in the cluster must have raced our
1196                 * rename to create one. Today we error cleanly, in
1197                 * the future we should consider calling iget to build
1198                 * a new struct inode for this entry. */
1199                if (!new_inode) {
1200                        status = -EACCES;
1201
1202                        mlog(0, "We found an inode for name %.*s but VFS "
1203                             "didn't give us one.\n", new_dentry->d_name.len,
1204                             new_dentry->d_name.name);
1205                        goto bail;
1206                }
1207
1208                if (OCFS2_I(new_inode)->ip_blkno != newfe_blkno) {
1209                        status = -EACCES;
1210
1211                        mlog(0, "Inode %llu and dir %llu disagree. flags = %x\n",
1212                             (unsigned long long)OCFS2_I(new_inode)->ip_blkno,
1213                             (unsigned long long)newfe_blkno,
1214                             OCFS2_I(new_inode)->ip_flags);
1215                        goto bail;
1216                }
1217
1218                status = ocfs2_inode_lock(new_inode, &newfe_bh, 1);
1219                if (status < 0) {
1220                        if (status != -ENOENT)
1221                                mlog_errno(status);
1222                        goto bail;
1223                }
1224                new_child_locked = 1;
1225
1226                status = ocfs2_remote_dentry_delete(new_dentry);
1227                if (status < 0) {
1228                        mlog_errno(status);
1229                        goto bail;
1230                }
1231
1232                newfe = (struct ocfs2_dinode *) newfe_bh->b_data;
1233
1234                mlog(0, "aha rename over existing... new_blkno=%llu "
1235                     "newfebh=%p bhblocknr=%llu\n",
1236                     (unsigned long long)newfe_blkno, newfe_bh, newfe_bh ?
1237                     (unsigned long long)newfe_bh->b_blocknr : 0ULL);
1238
1239                if (S_ISDIR(new_inode->i_mode) || (new_inode->i_nlink == 1)) {
1240                        status = ocfs2_prepare_orphan_dir(osb, &orphan_dir,
1241                                                          new_inode,
1242                                                          orphan_name,
1243                                                          &orphan_insert);
1244                        if (status < 0) {
1245                                mlog_errno(status);
1246                                goto bail;
1247                        }
1248                }
1249        } else {
1250                BUG_ON(new_dentry->d_parent->d_inode != new_dir);
1251
1252                status = ocfs2_check_dir_for_entry(new_dir,
1253                                                   new_dentry->d_name.name,
1254                                                   new_dentry->d_name.len);
1255                if (status)
1256                        goto bail;
1257
1258                status = ocfs2_prepare_dir_for_insert(osb, new_dir, new_dir_bh,
1259                                                      new_dentry->d_name.name,
1260                                                      new_dentry->d_name.len,
1261                                                      &target_insert);
1262                if (status < 0) {
1263                        mlog_errno(status);
1264                        goto bail;
1265                }
1266        }
1267
1268        handle = ocfs2_start_trans(osb, ocfs2_rename_credits(osb->sb));
1269        if (IS_ERR(handle)) {
1270                status = PTR_ERR(handle);
1271                handle = NULL;
1272                mlog_errno(status);
1273                goto bail;
1274        }
1275
1276        if (target_exists) {
1277                if (S_ISDIR(new_inode->i_mode)) {
1278                        if (new_inode->i_nlink != 2 ||
1279                            !ocfs2_empty_dir(new_inode)) {
1280                                status = -ENOTEMPTY;
1281                                goto bail;
1282                        }
1283                }
1284                status = ocfs2_journal_access_di(handle, new_inode, newfe_bh,
1285                                                 OCFS2_JOURNAL_ACCESS_WRITE);
1286                if (status < 0) {
1287                        mlog_errno(status);
1288                        goto bail;
1289                }
1290
1291                if (S_ISDIR(new_inode->i_mode) ||
1292                    (ocfs2_read_links_count(newfe) == 1)) {
1293                        status = ocfs2_orphan_add(osb, handle, new_inode,
1294                                                  newfe, orphan_name,
1295                                                  &orphan_insert, orphan_dir);
1296                        if (status < 0) {
1297                                mlog_errno(status);
1298                                goto bail;
1299                        }
1300                }
1301
1302                /* change the dirent to point to the correct inode */
1303                status = ocfs2_update_entry(new_dir, handle, &target_lookup_res,
1304                                            old_inode);
1305                if (status < 0) {
1306                        mlog_errno(status);
1307                        goto bail;
1308                }
1309                new_dir->i_version++;
1310
1311                if (S_ISDIR(new_inode->i_mode))
1312                        ocfs2_set_links_count(newfe, 0);
1313                else
1314                        ocfs2_add_links_count(newfe, -1);
1315
1316                status = ocfs2_journal_dirty(handle, newfe_bh);
1317                if (status < 0) {
1318                        mlog_errno(status);
1319                        goto bail;
1320                }
1321        } else {
1322                /* if the name was not found in new_dir, add it now */
1323                status = ocfs2_add_entry(handle, new_dentry, old_inode,
1324                                         OCFS2_I(old_inode)->ip_blkno,
1325                                         new_dir_bh, &target_insert);
1326        }
1327
1328        old_inode->i_ctime = CURRENT_TIME;
1329        mark_inode_dirty(old_inode);
1330
1331        status = ocfs2_journal_access_di(handle, old_inode, old_inode_bh,
1332                                         OCFS2_JOURNAL_ACCESS_WRITE);
1333        if (status >= 0) {
1334                old_di = (struct ocfs2_dinode *) old_inode_bh->b_data;
1335
1336                old_di->i_ctime = cpu_to_le64(old_inode->i_ctime.tv_sec);
1337                old_di->i_ctime_nsec = cpu_to_le32(old_inode->i_ctime.tv_nsec);
1338
1339                status = ocfs2_journal_dirty(handle, old_inode_bh);
1340                if (status < 0)
1341                        mlog_errno(status);
1342        } else
1343                mlog_errno(status);
1344
1345        /*
1346         * Now that the name has been added to new_dir, remove the old name.
1347         *
1348         * We don't keep any directory entry context around until now
1349         * because the insert might have changed the type of directory
1350         * we're dealing with.
1351         */
1352        status = ocfs2_find_entry(old_dentry->d_name.name,
1353                                  old_dentry->d_name.len, old_dir,
1354                                  &old_entry_lookup);
1355        if (status)
1356                goto bail;
1357
1358        status = ocfs2_delete_entry(handle, old_dir, &old_entry_lookup);
1359        if (status < 0) {
1360                mlog_errno(status);
1361                goto bail;
1362        }
1363
1364        if (new_inode) {
1365                new_inode->i_nlink--;
1366                new_inode->i_ctime = CURRENT_TIME;
1367        }
1368        old_dir->i_ctime = old_dir->i_mtime = CURRENT_TIME;
1369
1370        if (update_dot_dot) {
1371                status = ocfs2_update_entry(old_inode, handle,
1372                                            &old_inode_dot_dot_res, new_dir);
1373                old_dir->i_nlink--;
1374                if (new_inode) {
1375                        new_inode->i_nlink--;
1376                } else {
1377                        inc_nlink(new_dir);
1378                        mark_inode_dirty(new_dir);
1379                }
1380        }
1381        mark_inode_dirty(old_dir);
1382        ocfs2_mark_inode_dirty(handle, old_dir, old_dir_bh);
1383        if (new_inode) {
1384                mark_inode_dirty(new_inode);
1385                ocfs2_mark_inode_dirty(handle, new_inode, newfe_bh);
1386        }
1387
1388        if (old_dir != new_dir) {
1389                /* Keep the same times on both directories.*/
1390                new_dir->i_ctime = new_dir->i_mtime = old_dir->i_ctime;
1391
1392                /*
1393                 * This will also pick up the i_nlink change from the
1394                 * block above.
1395                 */
1396                ocfs2_mark_inode_dirty(handle, new_dir, new_dir_bh);
1397        }
1398
1399        if (old_dir_nlink != old_dir->i_nlink) {
1400                if (!old_dir_bh) {
1401                        mlog(ML_ERROR, "need to change nlink for old dir "
1402                             "%llu from %d to %d but bh is NULL!\n",
1403                             (unsigned long long)OCFS2_I(old_dir)->ip_blkno,
1404                             (int)old_dir_nlink, old_dir->i_nlink);
1405                } else {
1406                        struct ocfs2_dinode *fe;
1407                        status = ocfs2_journal_access_di(handle, old_dir,
1408                                                      old_dir_bh,
1409                                                      OCFS2_JOURNAL_ACCESS_WRITE);
1410                        fe = (struct ocfs2_dinode *) old_dir_bh->b_data;
1411                        ocfs2_set_links_count(fe, old_dir->i_nlink);
1412                        status = ocfs2_journal_dirty(handle, old_dir_bh);
1413                }
1414        }
1415        ocfs2_dentry_move(old_dentry, new_dentry, old_dir, new_dir);
1416        status = 0;
1417bail:
1418        if (rename_lock)
1419                ocfs2_rename_unlock(osb);
1420
1421        if (handle)
1422                ocfs2_commit_trans(osb, handle);
1423
1424        if (parents_locked)
1425                ocfs2_double_unlock(old_dir, new_dir);
1426
1427        if (old_child_locked)
1428                ocfs2_inode_unlock(old_inode, 1);
1429
1430        if (new_child_locked)
1431                ocfs2_inode_unlock(new_inode, 1);
1432
1433        if (orphan_dir) {
1434                /* This was locked for us in ocfs2_prepare_orphan_dir() */
1435                ocfs2_inode_unlock(orphan_dir, 1);
1436                mutex_unlock(&orphan_dir->i_mutex);
1437                iput(orphan_dir);
1438        }
1439
1440        if (new_inode)
1441                sync_mapping_buffers(old_inode->i_mapping);
1442
1443        if (new_inode)
1444                iput(new_inode);
1445
1446        ocfs2_free_dir_lookup_result(&target_lookup_res);
1447        ocfs2_free_dir_lookup_result(&old_entry_lookup);
1448        ocfs2_free_dir_lookup_result(&old_inode_dot_dot_res);
1449        ocfs2_free_dir_lookup_result(&orphan_insert);
1450        ocfs2_free_dir_lookup_result(&target_insert);
1451
1452        brelse(newfe_bh);
1453        brelse(old_inode_bh);
1454        brelse(old_dir_bh);
1455        brelse(new_dir_bh);
1456
1457        mlog_exit(status);
1458
1459        return status;
1460}
1461
1462/*
1463 * we expect i_size = strlen(symname). Copy symname into the file
1464 * data, including the null terminator.
1465 */
1466static int ocfs2_create_symlink_data(struct ocfs2_super *osb,
1467                                     handle_t *handle,
1468                                     struct inode *inode,
1469                                     const char *symname)
1470{
1471        struct buffer_head **bhs = NULL;
1472        const char *c;
1473        struct super_block *sb = osb->sb;
1474        u64 p_blkno, p_blocks;
1475        int virtual, blocks, status, i, bytes_left;
1476
1477        bytes_left = i_size_read(inode) + 1;
1478        /* we can't trust i_blocks because we're actually going to
1479         * write i_size + 1 bytes. */
1480        blocks = (bytes_left + sb->s_blocksize - 1) >> sb->s_blocksize_bits;
1481
1482        mlog_entry("i_blocks = %llu, i_size = %llu, blocks = %d\n",
1483                        (unsigned long long)inode->i_blocks,
1484                        i_size_read(inode), blocks);
1485
1486        /* Sanity check -- make sure we're going to fit. */
1487        if (bytes_left >
1488            ocfs2_clusters_to_bytes(sb, OCFS2_I(inode)->ip_clusters)) {
1489                status = -EIO;
1490                mlog_errno(status);
1491                goto bail;
1492        }
1493
1494        bhs = kcalloc(blocks, sizeof(struct buffer_head *), GFP_KERNEL);
1495        if (!bhs) {
1496                status = -ENOMEM;
1497                mlog_errno(status);
1498                goto bail;
1499        }
1500
1501        status = ocfs2_extent_map_get_blocks(inode, 0, &p_blkno, &p_blocks,
1502                                             NULL);
1503        if (status < 0) {
1504                mlog_errno(status);
1505                goto bail;
1506        }
1507
1508        /* links can never be larger than one cluster so we know this
1509         * is all going to be contiguous, but do a sanity check
1510         * anyway. */
1511        if ((p_blocks << sb->s_blocksize_bits) < bytes_left) {
1512                status = -EIO;
1513                mlog_errno(status);
1514                goto bail;
1515        }
1516
1517        virtual = 0;
1518        while(bytes_left > 0) {
1519                c = &symname[virtual * sb->s_blocksize];
1520
1521                bhs[virtual] = sb_getblk(sb, p_blkno);
1522                if (!bhs[virtual]) {
1523                        status = -ENOMEM;
1524                        mlog_errno(status);
1525                        goto bail;
1526                }
1527                ocfs2_set_new_buffer_uptodate(inode, bhs[virtual]);
1528
1529                status = ocfs2_journal_access(handle, inode, bhs[virtual],
1530                                              OCFS2_JOURNAL_ACCESS_CREATE);
1531                if (status < 0) {
1532                        mlog_errno(status);
1533                        goto bail;
1534                }
1535
1536                memset(bhs[virtual]->b_data, 0, sb->s_blocksize);
1537
1538                memcpy(bhs[virtual]->b_data, c,
1539                       (bytes_left > sb->s_blocksize) ? sb->s_blocksize :
1540                       bytes_left);
1541
1542                status = ocfs2_journal_dirty(handle, bhs[virtual]);
1543                if (status < 0) {
1544                        mlog_errno(status);
1545                        goto bail;
1546                }
1547
1548                virtual++;
1549                p_blkno++;
1550                bytes_left -= sb->s_blocksize;
1551        }
1552
1553        status = 0;
1554bail:
1555
1556        if (bhs) {
1557                for(i = 0; i < blocks; i++)
1558                        brelse(bhs[i]);
1559                kfree(bhs);
1560        }
1561
1562        mlog_exit(status);
1563        return status;
1564}
1565
1566static int ocfs2_symlink(struct inode *dir,
1567                         struct dentry *dentry,
1568                         const char *symname)
1569{
1570        int status, l, credits;
1571        u64 newsize;
1572        struct ocfs2_super *osb = NULL;
1573        struct inode *inode = NULL;
1574        struct super_block *sb;
1575        struct buffer_head *new_fe_bh = NULL;
1576        struct buffer_head *parent_fe_bh = NULL;
1577        struct ocfs2_dinode *fe = NULL;
1578        struct ocfs2_dinode *dirfe;
1579        handle_t *handle = NULL;
1580        struct ocfs2_alloc_context *inode_ac = NULL;
1581        struct ocfs2_alloc_context *data_ac = NULL;
1582        struct ocfs2_alloc_context *xattr_ac = NULL;
1583        int want_clusters = 0;
1584        int xattr_credits = 0;
1585        struct ocfs2_security_xattr_info si = {
1586                .enable = 1,
1587        };
1588        int did_quota = 0, did_quota_inode = 0;
1589        struct ocfs2_dir_lookup_result lookup = { NULL, };
1590
1591        mlog_entry("(0x%p, 0x%p, symname='%s' actual='%.*s')\n", dir,
1592                   dentry, symname, dentry->d_name.len, dentry->d_name.name);
1593
1594        sb = dir->i_sb;
1595        osb = OCFS2_SB(sb);
1596
1597        l = strlen(symname) + 1;
1598
1599        credits = ocfs2_calc_symlink_credits(sb);
1600
1601        /* lock the parent directory */
1602        status = ocfs2_inode_lock(dir, &parent_fe_bh, 1);
1603        if (status < 0) {
1604                if (status != -ENOENT)
1605                        mlog_errno(status);
1606                return status;
1607        }
1608
1609        dirfe = (struct ocfs2_dinode *) parent_fe_bh->b_data;
1610        if (!ocfs2_read_links_count(dirfe)) {
1611                /* can't make a file in a deleted directory. */
1612                status = -ENOENT;
1613                goto bail;
1614        }
1615
1616        status = ocfs2_check_dir_for_entry(dir, dentry->d_name.name,
1617                                           dentry->d_name.len);
1618        if (status)
1619                goto bail;
1620
1621        status = ocfs2_prepare_dir_for_insert(osb, dir, parent_fe_bh,
1622                                              dentry->d_name.name,
1623                                              dentry->d_name.len, &lookup);
1624        if (status < 0) {
1625                mlog_errno(status);
1626                goto bail;
1627        }
1628
1629        status = ocfs2_reserve_new_inode(osb, &inode_ac);
1630        if (status < 0) {
1631                if (status != -ENOSPC)
1632                        mlog_errno(status);
1633                goto bail;
1634        }
1635
1636        inode = ocfs2_get_init_inode(dir, S_IFLNK | S_IRWXUGO);
1637        if (!inode) {
1638                status = -ENOMEM;
1639                mlog_errno(status);
1640                goto bail;
1641        }
1642
1643        /* get security xattr */
1644        status = ocfs2_init_security_get(inode, dir, &si);
1645        if (status) {
1646                if (status == -EOPNOTSUPP)
1647                        si.enable = 0;
1648                else {
1649                        mlog_errno(status);
1650                        goto bail;
1651                }
1652        }
1653
1654        /* calculate meta data/clusters for setting security xattr */
1655        if (si.enable) {
1656                status = ocfs2_calc_security_init(dir, &si, &want_clusters,
1657                                                  &xattr_credits, &xattr_ac);
1658                if (status < 0) {
1659                        mlog_errno(status);
1660                        goto bail;
1661                }
1662        }
1663
1664        /* don't reserve bitmap space for fast symlinks. */
1665        if (l > ocfs2_fast_symlink_chars(sb))
1666                want_clusters += 1;
1667
1668        status = ocfs2_reserve_clusters(osb, want_clusters, &data_ac);
1669        if (status < 0) {
1670                if (status != -ENOSPC)
1671                        mlog_errno(status);
1672                goto bail;
1673        }
1674
1675        handle = ocfs2_start_trans(osb, credits + xattr_credits);
1676        if (IS_ERR(handle)) {
1677                status = PTR_ERR(handle);
1678                handle = NULL;
1679                mlog_errno(status);
1680                goto bail;
1681        }
1682
1683        /* We don't use standard VFS wrapper because we don't want vfs_dq_init
1684         * to be called. */
1685        if (sb_any_quota_active(osb->sb) &&
1686            osb->sb->dq_op->alloc_inode(inode, 1) == NO_QUOTA) {
1687                status = -EDQUOT;
1688                goto bail;
1689        }
1690        did_quota_inode = 1;
1691
1692        status = ocfs2_mknod_locked(osb, dir, inode, dentry,
1693                                    0, &new_fe_bh, parent_fe_bh, handle,
1694                                    inode_ac);
1695        if (status < 0) {
1696                mlog_errno(status);
1697                goto bail;
1698        }
1699
1700        fe = (struct ocfs2_dinode *) new_fe_bh->b_data;
1701        inode->i_rdev = 0;
1702        newsize = l - 1;
1703        if (l > ocfs2_fast_symlink_chars(sb)) {
1704                u32 offset = 0;
1705
1706                inode->i_op = &ocfs2_symlink_inode_operations;
1707                if (vfs_dq_alloc_space_nodirty(inode,
1708                    ocfs2_clusters_to_bytes(osb->sb, 1))) {
1709                        status = -EDQUOT;
1710                        goto bail;
1711                }
1712                did_quota = 1;
1713                status = ocfs2_add_inode_data(osb, inode, &offset, 1, 0,
1714                                              new_fe_bh,
1715                                              handle, data_ac, NULL,
1716                                              NULL);
1717                if (status < 0) {
1718                        if (status != -ENOSPC && status != -EINTR) {
1719                                mlog(ML_ERROR,
1720                                     "Failed to extend file to %llu\n",
1721                                     (unsigned long long)newsize);
1722                                mlog_errno(status);
1723                                status = -ENOSPC;
1724                        }
1725                        goto bail;
1726                }
1727                i_size_write(inode, newsize);
1728                inode->i_blocks = ocfs2_inode_sector_count(inode);
1729        } else {
1730                inode->i_op = &ocfs2_fast_symlink_inode_operations;
1731                memcpy((char *) fe->id2.i_symlink, symname, l);
1732                i_size_write(inode, newsize);
1733                inode->i_blocks = 0;
1734        }
1735
1736        status = ocfs2_mark_inode_dirty(handle, inode, new_fe_bh);
1737        if (status < 0) {
1738                mlog_errno(status);
1739                goto bail;
1740        }
1741
1742        if (!ocfs2_inode_is_fast_symlink(inode)) {
1743                status = ocfs2_create_symlink_data(osb, handle, inode,
1744                                                   symname);
1745                if (status < 0) {
1746                        mlog_errno(status);
1747                        goto bail;
1748                }
1749        }
1750
1751        if (si.enable) {
1752                status = ocfs2_init_security_set(handle, inode, new_fe_bh, &si,
1753                                                 xattr_ac, data_ac);
1754                if (status < 0) {
1755                        mlog_errno(status);
1756                        goto bail;
1757                }
1758        }
1759
1760        status = ocfs2_add_entry(handle, dentry, inode,
1761                                 le64_to_cpu(fe->i_blkno), parent_fe_bh,
1762                                 &lookup);
1763        if (status < 0) {
1764                mlog_errno(status);
1765                goto bail;
1766        }
1767
1768        status = ocfs2_dentry_attach_lock(dentry, inode, OCFS2_I(dir)->ip_blkno);
1769        if (status) {
1770                mlog_errno(status);
1771                goto bail;
1772        }
1773
1774        insert_inode_hash(inode);
1775        dentry->d_op = &ocfs2_dentry_ops;
1776        d_instantiate(dentry, inode);
1777bail:
1778        if (status < 0 && did_quota)
1779                vfs_dq_free_space_nodirty(inode,
1780                                        ocfs2_clusters_to_bytes(osb->sb, 1));
1781        if (status < 0 && did_quota_inode)
1782                vfs_dq_free_inode(inode);
1783        if (handle)
1784                ocfs2_commit_trans(osb, handle);
1785
1786        ocfs2_inode_unlock(dir, 1);
1787
1788        brelse(new_fe_bh);
1789        brelse(parent_fe_bh);
1790        kfree(si.name);
1791        kfree(si.value);
1792        ocfs2_free_dir_lookup_result(&lookup);
1793        if (inode_ac)
1794                ocfs2_free_alloc_context(inode_ac);
1795        if (data_ac)
1796                ocfs2_free_alloc_context(data_ac);
1797        if (xattr_ac)
1798                ocfs2_free_alloc_context(xattr_ac);
1799        if ((status < 0) && inode) {
1800                clear_nlink(inode);
1801                iput(inode);
1802        }
1803
1804        mlog_exit(status);
1805
1806        return status;
1807}
1808
1809static int ocfs2_blkno_stringify(u64 blkno, char *name)
1810{
1811        int status, namelen;
1812
1813        mlog_entry_void();
1814
1815        namelen = snprintf(name, OCFS2_ORPHAN_NAMELEN + 1, "%016llx",
1816                           (long long)blkno);
1817        if (namelen <= 0) {
1818                if (namelen)
1819                        status = namelen;
1820                else
1821                        status = -EINVAL;
1822                mlog_errno(status);
1823                goto bail;
1824        }
1825        if (namelen != OCFS2_ORPHAN_NAMELEN) {
1826                status = -EINVAL;
1827                mlog_errno(status);
1828                goto bail;
1829        }
1830
1831        mlog(0, "built filename '%s' for orphan dir (len=%d)\n", name,
1832             namelen);
1833
1834        status = 0;
1835bail:
1836        mlog_exit(status);
1837        return status;
1838}
1839
1840static int ocfs2_prepare_orphan_dir(struct ocfs2_super *osb,
1841                                    struct inode **ret_orphan_dir,
1842                                    struct inode *inode,
1843                                    char *name,
1844                                    struct ocfs2_dir_lookup_result *lookup)
1845{
1846        struct inode *orphan_dir_inode;
1847        struct buffer_head *orphan_dir_bh = NULL;
1848        int status = 0;
1849
1850        status = ocfs2_blkno_stringify(OCFS2_I(inode)->ip_blkno, name);
1851        if (status < 0) {
1852                mlog_errno(status);
1853                return status;
1854        }
1855
1856        orphan_dir_inode = ocfs2_get_system_file_inode(osb,
1857                                                       ORPHAN_DIR_SYSTEM_INODE,
1858                                                       osb->slot_num);
1859        if (!orphan_dir_inode) {
1860                status = -ENOENT;
1861                mlog_errno(status);
1862                return status;
1863        }
1864
1865        mutex_lock(&orphan_dir_inode->i_mutex);
1866
1867        status = ocfs2_inode_lock(orphan_dir_inode, &orphan_dir_bh, 1);
1868        if (status < 0) {
1869                mlog_errno(status);
1870                goto leave;
1871        }
1872
1873        status = ocfs2_prepare_dir_for_insert(osb, orphan_dir_inode,
1874                                              orphan_dir_bh, name,
1875                                              OCFS2_ORPHAN_NAMELEN, lookup);
1876        if (status < 0) {
1877                ocfs2_inode_unlock(orphan_dir_inode, 1);
1878
1879                mlog_errno(status);
1880                goto leave;
1881        }
1882
1883        *ret_orphan_dir = orphan_dir_inode;
1884
1885leave:
1886        if (status) {
1887                mutex_unlock(&orphan_dir_inode->i_mutex);
1888                iput(orphan_dir_inode);
1889        }
1890
1891        brelse(orphan_dir_bh);
1892
1893        mlog_exit(status);
1894        return status;
1895}
1896
1897static int ocfs2_orphan_add(struct ocfs2_super *osb,
1898                            handle_t *handle,
1899                            struct inode *inode,
1900                            struct ocfs2_dinode *fe,
1901                            char *name,
1902                            struct ocfs2_dir_lookup_result *lookup,
1903                            struct inode *orphan_dir_inode)
1904{
1905        struct buffer_head *orphan_dir_bh = NULL;
1906        int status = 0;
1907        struct ocfs2_dinode *orphan_fe;
1908
1909        mlog_entry("(inode->i_ino = %lu)\n", inode->i_ino);
1910
1911        status = ocfs2_read_inode_block(orphan_dir_inode, &orphan_dir_bh);
1912        if (status < 0) {
1913                mlog_errno(status);
1914                goto leave;
1915        }
1916
1917        status = ocfs2_journal_access_di(handle, orphan_dir_inode, orphan_dir_bh,
1918                                         OCFS2_JOURNAL_ACCESS_WRITE);
1919        if (status < 0) {
1920                mlog_errno(status);
1921                goto leave;
1922        }
1923
1924        /* we're a cluster, and nlink can change on disk from
1925         * underneath us... */
1926        orphan_fe = (struct ocfs2_dinode *) orphan_dir_bh->b_data;
1927        if (S_ISDIR(inode->i_mode))
1928                ocfs2_add_links_count(orphan_fe, 1);
1929        orphan_dir_inode->i_nlink = ocfs2_read_links_count(orphan_fe);
1930
1931        status = ocfs2_journal_dirty(handle, orphan_dir_bh);
1932        if (status < 0) {
1933                mlog_errno(status);
1934                goto leave;
1935        }
1936
1937        status = __ocfs2_add_entry(handle, orphan_dir_inode, name,
1938                                   OCFS2_ORPHAN_NAMELEN, inode,
1939                                   OCFS2_I(inode)->ip_blkno,
1940                                   orphan_dir_bh, lookup);
1941        if (status < 0) {
1942                mlog_errno(status);
1943                goto leave;
1944        }
1945
1946        le32_add_cpu(&fe->i_flags, OCFS2_ORPHANED_FL);
1947
1948        /* Record which orphan dir our inode now resides
1949         * in. delete_inode will use this to determine which orphan
1950         * dir to lock. */
1951        fe->i_orphaned_slot = cpu_to_le16(osb->slot_num);
1952
1953        mlog(0, "Inode %llu orphaned in slot %d\n",
1954             (unsigned long long)OCFS2_I(inode)->ip_blkno, osb->slot_num);
1955
1956leave:
1957        brelse(orphan_dir_bh);
1958
1959        mlog_exit(status);
1960        return status;
1961}
1962
1963/* unlike orphan_add, we expect the orphan dir to already be locked here. */
1964int ocfs2_orphan_del(struct ocfs2_super *osb,
1965                     handle_t *handle,
1966                     struct inode *orphan_dir_inode,
1967                     struct inode *inode,
1968                     struct buffer_head *orphan_dir_bh)
1969{
1970        char name[OCFS2_ORPHAN_NAMELEN + 1];
1971        struct ocfs2_dinode *orphan_fe;
1972        int status = 0;
1973        struct ocfs2_dir_lookup_result lookup = { NULL, };
1974
1975        mlog_entry_void();
1976
1977        status = ocfs2_blkno_stringify(OCFS2_I(inode)->ip_blkno, name);
1978        if (status < 0) {
1979                mlog_errno(status);
1980                goto leave;
1981        }
1982
1983        mlog(0, "removing '%s' from orphan dir %llu (namelen=%d)\n",
1984             name, (unsigned long long)OCFS2_I(orphan_dir_inode)->ip_blkno,
1985             OCFS2_ORPHAN_NAMELEN);
1986
1987        /* find it's spot in the orphan directory */
1988        status = ocfs2_find_entry(name, OCFS2_ORPHAN_NAMELEN, orphan_dir_inode,
1989                                  &lookup);
1990        if (status) {
1991                mlog_errno(status);
1992                goto leave;
1993        }
1994
1995        /* remove it from the orphan directory */
1996        status = ocfs2_delete_entry(handle, orphan_dir_inode, &lookup);
1997        if (status < 0) {
1998                mlog_errno(status);
1999                goto leave;
2000        }
2001
2002        status = ocfs2_journal_access_di(handle,orphan_dir_inode,  orphan_dir_bh,
2003                                         OCFS2_JOURNAL_ACCESS_WRITE);
2004        if (status < 0) {
2005                mlog_errno(status);
2006                goto leave;
2007        }
2008
2009        /* do the i_nlink dance! :) */
2010        orphan_fe = (struct ocfs2_dinode *) orphan_dir_bh->b_data;
2011        if (S_ISDIR(inode->i_mode))
2012                ocfs2_add_links_count(orphan_fe, -1);
2013        orphan_dir_inode->i_nlink = ocfs2_read_links_count(orphan_fe);
2014
2015        status = ocfs2_journal_dirty(handle, orphan_dir_bh);
2016        if (status < 0) {
2017                mlog_errno(status);
2018                goto leave;
2019        }
2020
2021leave:
2022        ocfs2_free_dir_lookup_result(&lookup);
2023
2024        mlog_exit(status);
2025        return status;
2026}
2027
2028const struct inode_operations ocfs2_dir_iops = {
2029        .create         = ocfs2_create,
2030        .lookup         = ocfs2_lookup,
2031        .link           = ocfs2_link,
2032        .unlink         = ocfs2_unlink,
2033        .rmdir          = ocfs2_unlink,
2034        .symlink        = ocfs2_symlink,
2035        .mkdir          = ocfs2_mkdir,
2036        .mknod          = ocfs2_mknod,
2037        .rename         = ocfs2_rename,
2038        .setattr        = ocfs2_setattr,
2039        .getattr        = ocfs2_getattr,
2040        .permission     = ocfs2_permission,
2041        .setxattr       = generic_setxattr,
2042        .getxattr       = generic_getxattr,
2043        .listxattr      = ocfs2_listxattr,
2044        .removexattr    = generic_removexattr,
2045};
2046
lxr.linux.no kindly hosted by Redpill Linpro AS, provider of Linux consulting and operations services since 1995.