linux/fs/gfs2/ops_inode.c
<<
>>
Prefs
   1/*
   2 * Copyright (C) Sistina Software, Inc.  1997-2003 All rights reserved.
   3 * Copyright (C) 2004-2006 Red Hat, Inc.  All rights reserved.
   4 *
   5 * This copyrighted material is made available to anyone wishing to use,
   6 * modify, copy, or redistribute it subject to the terms and conditions
   7 * of the GNU General Public License version 2.
   8 */
   9
  10#include <linux/slab.h>
  11#include <linux/spinlock.h>
  12#include <linux/completion.h>
  13#include <linux/buffer_head.h>
  14#include <linux/namei.h>
  15#include <linux/utsname.h>
  16#include <linux/mm.h>
  17#include <linux/xattr.h>
  18#include <linux/posix_acl.h>
  19#include <linux/gfs2_ondisk.h>
  20#include <linux/crc32.h>
  21#include <linux/lm_interface.h>
  22#include <asm/uaccess.h>
  23
  24#include "gfs2.h"
  25#include "incore.h"
  26#include "acl.h"
  27#include "bmap.h"
  28#include "dir.h"
  29#include "eaops.h"
  30#include "eattr.h"
  31#include "glock.h"
  32#include "inode.h"
  33#include "meta_io.h"
  34#include "ops_dentry.h"
  35#include "ops_inode.h"
  36#include "quota.h"
  37#include "rgrp.h"
  38#include "trans.h"
  39#include "util.h"
  40
  41/**
  42 * gfs2_create - Create a file
  43 * @dir: The directory in which to create the file
  44 * @dentry: The dentry of the new file
  45 * @mode: The mode of the new file
  46 *
  47 * Returns: errno
  48 */
  49
  50static int gfs2_create(struct inode *dir, struct dentry *dentry,
  51                       int mode, struct nameidata *nd)
  52{
  53        struct gfs2_inode *dip = GFS2_I(dir);
  54        struct gfs2_sbd *sdp = GFS2_SB(dir);
  55        struct gfs2_holder ghs[2];
  56        struct inode *inode;
  57
  58        gfs2_holder_init(dip->i_gl, 0, 0, ghs);
  59
  60        for (;;) {
  61                inode = gfs2_createi(ghs, &dentry->d_name, S_IFREG | mode, 0);
  62                if (!IS_ERR(inode)) {
  63                        gfs2_trans_end(sdp);
  64                        if (dip->i_alloc.al_rgd)
  65                                gfs2_inplace_release(dip);
  66                        gfs2_quota_unlock(dip);
  67                        gfs2_alloc_put(dip);
  68                        gfs2_glock_dq_uninit_m(2, ghs);
  69                        mark_inode_dirty(inode);
  70                        break;
  71                } else if (PTR_ERR(inode) != -EEXIST ||
  72                           (nd && (nd->intent.open.flags & O_EXCL))) {
  73                        gfs2_holder_uninit(ghs);
  74                        return PTR_ERR(inode);
  75                }
  76
  77                inode = gfs2_lookupi(dir, &dentry->d_name, 0, nd);
  78                if (inode) {
  79                        if (!IS_ERR(inode)) {
  80                                gfs2_holder_uninit(ghs);
  81                                break;
  82                        } else {
  83                                gfs2_holder_uninit(ghs);
  84                                return PTR_ERR(inode);
  85                        }
  86                }
  87        }
  88
  89        d_instantiate(dentry, inode);
  90
  91        return 0;
  92}
  93
  94/**
  95 * gfs2_lookup - Look up a filename in a directory and return its inode
  96 * @dir: The directory inode
  97 * @dentry: The dentry of the new inode
  98 * @nd: passed from Linux VFS, ignored by us
  99 *
 100 * Called by the VFS layer. Lock dir and call gfs2_lookupi()
 101 *
 102 * Returns: errno
 103 */
 104
 105static struct dentry *gfs2_lookup(struct inode *dir, struct dentry *dentry,
 106                                  struct nameidata *nd)
 107{
 108        struct inode *inode = NULL;
 109
 110        dentry->d_op = &gfs2_dops;
 111
 112        inode = gfs2_lookupi(dir, &dentry->d_name, 0, nd);
 113        if (inode && IS_ERR(inode))
 114                return ERR_PTR(PTR_ERR(inode));
 115
 116        if (inode)
 117                return d_splice_alias(inode, dentry);
 118        d_add(dentry, inode);
 119
 120        return NULL;
 121}
 122
 123/**
 124 * gfs2_link - Link to a file
 125 * @old_dentry: The inode to link
 126 * @dir: Add link to this directory
 127 * @dentry: The name of the link
 128 *
 129 * Link the inode in "old_dentry" into the directory "dir" with the
 130 * name in "dentry".
 131 *
 132 * Returns: errno
 133 */
 134
 135static int gfs2_link(struct dentry *old_dentry, struct inode *dir,
 136                     struct dentry *dentry)
 137{
 138        struct gfs2_inode *dip = GFS2_I(dir);
 139        struct gfs2_sbd *sdp = GFS2_SB(dir);
 140        struct inode *inode = old_dentry->d_inode;
 141        struct gfs2_inode *ip = GFS2_I(inode);
 142        struct gfs2_holder ghs[2];
 143        int alloc_required;
 144        int error;
 145
 146        if (S_ISDIR(inode->i_mode))
 147                return -EPERM;
 148
 149        gfs2_holder_init(dip->i_gl, LM_ST_EXCLUSIVE, 0, ghs);
 150        gfs2_holder_init(ip->i_gl, LM_ST_EXCLUSIVE, 0, ghs + 1);
 151
 152        error = gfs2_glock_nq_m(2, ghs);
 153        if (error)
 154                goto out;
 155
 156        error = permission(dir, MAY_WRITE | MAY_EXEC, NULL);
 157        if (error)
 158                goto out_gunlock;
 159
 160        error = gfs2_dir_check(dir, &dentry->d_name, NULL);
 161        switch (error) {
 162        case -ENOENT:
 163                break;
 164        case 0:
 165                error = -EEXIST;
 166        default:
 167                goto out_gunlock;
 168        }
 169
 170        error = -EINVAL;
 171        if (!dip->i_inode.i_nlink)
 172                goto out_gunlock;
 173        error = -EFBIG;
 174        if (dip->i_di.di_entries == (u32)-1)
 175                goto out_gunlock;
 176        error = -EPERM;
 177        if (IS_IMMUTABLE(inode) || IS_APPEND(inode))
 178                goto out_gunlock;
 179        error = -EINVAL;
 180        if (!ip->i_inode.i_nlink)
 181                goto out_gunlock;
 182        error = -EMLINK;
 183        if (ip->i_inode.i_nlink == (u32)-1)
 184                goto out_gunlock;
 185
 186        alloc_required = error = gfs2_diradd_alloc_required(dir, &dentry->d_name);
 187        if (error < 0)
 188                goto out_gunlock;
 189        error = 0;
 190
 191        if (alloc_required) {
 192                struct gfs2_alloc *al = gfs2_alloc_get(dip);
 193
 194                error = gfs2_quota_lock(dip, NO_QUOTA_CHANGE, NO_QUOTA_CHANGE);
 195                if (error)
 196                        goto out_alloc;
 197
 198                error = gfs2_quota_check(dip, dip->i_inode.i_uid, dip->i_inode.i_gid);
 199                if (error)
 200                        goto out_gunlock_q;
 201
 202                al->al_requested = sdp->sd_max_dirres;
 203
 204                error = gfs2_inplace_reserve(dip);
 205                if (error)
 206                        goto out_gunlock_q;
 207
 208                error = gfs2_trans_begin(sdp, sdp->sd_max_dirres +
 209                                         al->al_rgd->rd_length +
 210                                         2 * RES_DINODE + RES_STATFS +
 211                                         RES_QUOTA, 0);
 212                if (error)
 213                        goto out_ipres;
 214        } else {
 215                error = gfs2_trans_begin(sdp, 2 * RES_DINODE + RES_LEAF, 0);
 216                if (error)
 217                        goto out_ipres;
 218        }
 219
 220        error = gfs2_dir_add(dir, &dentry->d_name, ip, IF2DT(inode->i_mode));
 221        if (error)
 222                goto out_end_trans;
 223
 224        error = gfs2_change_nlink(ip, +1);
 225
 226out_end_trans:
 227        gfs2_trans_end(sdp);
 228out_ipres:
 229        if (alloc_required)
 230                gfs2_inplace_release(dip);
 231out_gunlock_q:
 232        if (alloc_required)
 233                gfs2_quota_unlock(dip);
 234out_alloc:
 235        if (alloc_required)
 236                gfs2_alloc_put(dip);
 237out_gunlock:
 238        gfs2_glock_dq_m(2, ghs);
 239out:
 240        gfs2_holder_uninit(ghs);
 241        gfs2_holder_uninit(ghs + 1);
 242        if (!error) {
 243                atomic_inc(&inode->i_count);
 244                d_instantiate(dentry, inode);
 245                mark_inode_dirty(inode);
 246        }
 247        return error;
 248}
 249
 250/**
 251 * gfs2_unlink - Unlink a file
 252 * @dir: The inode of the directory containing the file to unlink
 253 * @dentry: The file itself
 254 *
 255 * Unlink a file.  Call gfs2_unlinki()
 256 *
 257 * Returns: errno
 258 */
 259
 260static int gfs2_unlink(struct inode *dir, struct dentry *dentry)
 261{
 262        struct gfs2_inode *dip = GFS2_I(dir);
 263        struct gfs2_sbd *sdp = GFS2_SB(dir);
 264        struct gfs2_inode *ip = GFS2_I(dentry->d_inode);
 265        struct gfs2_holder ghs[3];
 266        struct gfs2_rgrpd *rgd;
 267        struct gfs2_holder ri_gh;
 268        int error;
 269
 270        error = gfs2_rindex_hold(sdp, &ri_gh);
 271        if (error)
 272                return error;
 273
 274        gfs2_holder_init(dip->i_gl, LM_ST_EXCLUSIVE, 0, ghs);
 275        gfs2_holder_init(ip->i_gl,  LM_ST_EXCLUSIVE, 0, ghs + 1);
 276
 277        rgd = gfs2_blk2rgrpd(sdp, ip->i_no_addr);
 278        gfs2_holder_init(rgd->rd_gl, LM_ST_EXCLUSIVE, 0, ghs + 2);
 279
 280
 281        error = gfs2_glock_nq(ghs); /* parent */
 282        if (error)
 283                goto out_parent;
 284
 285        error = gfs2_glock_nq(ghs + 1); /* child */
 286        if (error)
 287                goto out_child;
 288
 289        error = gfs2_glock_nq(ghs + 2); /* rgrp */
 290        if (error)
 291                goto out_rgrp;
 292
 293        error = gfs2_unlink_ok(dip, &dentry->d_name, ip);
 294        if (error)
 295                goto out_rgrp;
 296
 297        error = gfs2_trans_begin(sdp, 2*RES_DINODE + RES_LEAF + RES_RG_BIT, 0);
 298        if (error)
 299                goto out_rgrp;
 300
 301        error = gfs2_dir_del(dip, &dentry->d_name);
 302        if (error)
 303                goto out_end_trans;
 304
 305        error = gfs2_change_nlink(ip, -1);
 306
 307out_end_trans:
 308        gfs2_trans_end(sdp);
 309        gfs2_glock_dq(ghs + 2);
 310out_rgrp:
 311        gfs2_holder_uninit(ghs + 2);
 312        gfs2_glock_dq(ghs + 1);
 313out_child:
 314        gfs2_holder_uninit(ghs + 1);
 315        gfs2_glock_dq(ghs);
 316out_parent:
 317        gfs2_holder_uninit(ghs);
 318        gfs2_glock_dq_uninit(&ri_gh);
 319        return error;
 320}
 321
 322/**
 323 * gfs2_symlink - Create a symlink
 324 * @dir: The directory to create the symlink in
 325 * @dentry: The dentry to put the symlink in
 326 * @symname: The thing which the link points to
 327 *
 328 * Returns: errno
 329 */
 330
 331static int gfs2_symlink(struct inode *dir, struct dentry *dentry,
 332                        const char *symname)
 333{
 334        struct gfs2_inode *dip = GFS2_I(dir), *ip;
 335        struct gfs2_sbd *sdp = GFS2_SB(dir);
 336        struct gfs2_holder ghs[2];
 337        struct inode *inode;
 338        struct buffer_head *dibh;
 339        int size;
 340        int error;
 341
 342        /* Must be stuffed with a null terminator for gfs2_follow_link() */
 343        size = strlen(symname);
 344        if (size > sdp->sd_sb.sb_bsize - sizeof(struct gfs2_dinode) - 1)
 345                return -ENAMETOOLONG;
 346
 347        gfs2_holder_init(dip->i_gl, 0, 0, ghs);
 348
 349        inode = gfs2_createi(ghs, &dentry->d_name, S_IFLNK | S_IRWXUGO, 0);
 350        if (IS_ERR(inode)) {
 351                gfs2_holder_uninit(ghs);
 352                return PTR_ERR(inode);
 353        }
 354
 355        ip = ghs[1].gh_gl->gl_object;
 356
 357        ip->i_di.di_size = size;
 358
 359        error = gfs2_meta_inode_buffer(ip, &dibh);
 360
 361        if (!gfs2_assert_withdraw(sdp, !error)) {
 362                gfs2_dinode_out(ip, dibh->b_data);
 363                memcpy(dibh->b_data + sizeof(struct gfs2_dinode), symname,
 364                       size);
 365                brelse(dibh);
 366        }
 367
 368        gfs2_trans_end(sdp);
 369        if (dip->i_alloc.al_rgd)
 370                gfs2_inplace_release(dip);
 371        gfs2_quota_unlock(dip);
 372        gfs2_alloc_put(dip);
 373
 374        gfs2_glock_dq_uninit_m(2, ghs);
 375
 376        d_instantiate(dentry, inode);
 377        mark_inode_dirty(inode);
 378
 379        return 0;
 380}
 381
 382/**
 383 * gfs2_mkdir - Make a directory
 384 * @dir: The parent directory of the new one
 385 * @dentry: The dentry of the new directory
 386 * @mode: The mode of the new directory
 387 *
 388 * Returns: errno
 389 */
 390
 391static int gfs2_mkdir(struct inode *dir, struct dentry *dentry, int mode)
 392{
 393        struct gfs2_inode *dip = GFS2_I(dir), *ip;
 394        struct gfs2_sbd *sdp = GFS2_SB(dir);
 395        struct gfs2_holder ghs[2];
 396        struct inode *inode;
 397        struct buffer_head *dibh;
 398        int error;
 399
 400        gfs2_holder_init(dip->i_gl, 0, 0, ghs);
 401
 402        inode = gfs2_createi(ghs, &dentry->d_name, S_IFDIR | mode, 0);
 403        if (IS_ERR(inode)) {
 404                gfs2_holder_uninit(ghs);
 405                return PTR_ERR(inode);
 406        }
 407
 408        ip = ghs[1].gh_gl->gl_object;
 409
 410        ip->i_inode.i_nlink = 2;
 411        ip->i_di.di_size = sdp->sd_sb.sb_bsize - sizeof(struct gfs2_dinode);
 412        ip->i_di.di_flags |= GFS2_DIF_JDATA;
 413        ip->i_di.di_entries = 2;
 414
 415        error = gfs2_meta_inode_buffer(ip, &dibh);
 416
 417        if (!gfs2_assert_withdraw(sdp, !error)) {
 418                struct gfs2_dinode *di = (struct gfs2_dinode *)dibh->b_data;
 419                struct gfs2_dirent *dent = (struct gfs2_dirent *)(di+1);
 420                struct qstr str;
 421
 422                gfs2_str2qstr(&str, ".");
 423                gfs2_trans_add_bh(ip->i_gl, dibh, 1);
 424                gfs2_qstr2dirent(&str, GFS2_DIRENT_SIZE(str.len), dent);
 425                dent->de_inum = di->di_num; /* already GFS2 endian */
 426                dent->de_type = cpu_to_be16(DT_DIR);
 427                di->di_entries = cpu_to_be32(1);
 428
 429                gfs2_str2qstr(&str, "..");
 430                dent = (struct gfs2_dirent *)((char*)dent + GFS2_DIRENT_SIZE(1));
 431                gfs2_qstr2dirent(&str, dibh->b_size - GFS2_DIRENT_SIZE(1) - sizeof(struct gfs2_dinode), dent);
 432
 433                gfs2_inum_out(dip, dent);
 434                dent->de_type = cpu_to_be16(DT_DIR);
 435
 436                gfs2_dinode_out(ip, di);
 437
 438                brelse(dibh);
 439        }
 440
 441        error = gfs2_change_nlink(dip, +1);
 442        gfs2_assert_withdraw(sdp, !error); /* dip already pinned */
 443
 444        gfs2_trans_end(sdp);
 445        if (dip->i_alloc.al_rgd)
 446                gfs2_inplace_release(dip);
 447        gfs2_quota_unlock(dip);
 448        gfs2_alloc_put(dip);
 449
 450        gfs2_glock_dq_uninit_m(2, ghs);
 451
 452        d_instantiate(dentry, inode);
 453        mark_inode_dirty(inode);
 454
 455        return 0;
 456}
 457
 458/**
 459 * gfs2_rmdir - Remove a directory
 460 * @dir: The parent directory of the directory to be removed
 461 * @dentry: The dentry of the directory to remove
 462 *
 463 * Remove a directory. Call gfs2_rmdiri()
 464 *
 465 * Returns: errno
 466 */
 467
 468static int gfs2_rmdir(struct inode *dir, struct dentry *dentry)
 469{
 470        struct gfs2_inode *dip = GFS2_I(dir);
 471        struct gfs2_sbd *sdp = GFS2_SB(dir);
 472        struct gfs2_inode *ip = GFS2_I(dentry->d_inode);
 473        struct gfs2_holder ghs[3];
 474        struct gfs2_rgrpd *rgd;
 475        struct gfs2_holder ri_gh;
 476        int error;
 477
 478
 479        error = gfs2_rindex_hold(sdp, &ri_gh);
 480        if (error)
 481                return error;
 482        gfs2_holder_init(dip->i_gl, LM_ST_EXCLUSIVE, 0, ghs);
 483        gfs2_holder_init(ip->i_gl, LM_ST_EXCLUSIVE, 0, ghs + 1);
 484
 485        rgd = gfs2_blk2rgrpd(sdp, ip->i_no_addr);
 486        gfs2_holder_init(rgd->rd_gl, LM_ST_EXCLUSIVE, 0, ghs + 2);
 487
 488        error = gfs2_glock_nq_m(3, ghs);
 489        if (error)
 490                goto out;
 491
 492        error = gfs2_unlink_ok(dip, &dentry->d_name, ip);
 493        if (error)
 494                goto out_gunlock;
 495
 496        if (ip->i_di.di_entries < 2) {
 497                if (gfs2_consist_inode(ip))
 498                        gfs2_dinode_print(ip);
 499                error = -EIO;
 500                goto out_gunlock;
 501        }
 502        if (ip->i_di.di_entries > 2) {
 503                error = -ENOTEMPTY;
 504                goto out_gunlock;
 505        }
 506
 507        error = gfs2_trans_begin(sdp, 2 * RES_DINODE + 3 * RES_LEAF + RES_RG_BIT, 0);
 508        if (error)
 509                goto out_gunlock;
 510
 511        error = gfs2_rmdiri(dip, &dentry->d_name, ip);
 512
 513        gfs2_trans_end(sdp);
 514
 515out_gunlock:
 516        gfs2_glock_dq_m(3, ghs);
 517out:
 518        gfs2_holder_uninit(ghs);
 519        gfs2_holder_uninit(ghs + 1);
 520        gfs2_holder_uninit(ghs + 2);
 521        gfs2_glock_dq_uninit(&ri_gh);
 522        return error;
 523}
 524
 525/**
 526 * gfs2_mknod - Make a special file
 527 * @dir: The directory in which the special file will reside
 528 * @dentry: The dentry of the special file
 529 * @mode: The mode of the special file
 530 * @rdev: The device specification of the special file
 531 *
 532 */
 533
 534static int gfs2_mknod(struct inode *dir, struct dentry *dentry, int mode,
 535                      dev_t dev)
 536{
 537        struct gfs2_inode *dip = GFS2_I(dir);
 538        struct gfs2_sbd *sdp = GFS2_SB(dir);
 539        struct gfs2_holder ghs[2];
 540        struct inode *inode;
 541
 542        gfs2_holder_init(dip->i_gl, 0, 0, ghs);
 543
 544        inode = gfs2_createi(ghs, &dentry->d_name, mode, dev);
 545        if (IS_ERR(inode)) {
 546                gfs2_holder_uninit(ghs);
 547                return PTR_ERR(inode);
 548        }
 549
 550        gfs2_trans_end(sdp);
 551        if (dip->i_alloc.al_rgd)
 552                gfs2_inplace_release(dip);
 553        gfs2_quota_unlock(dip);
 554        gfs2_alloc_put(dip);
 555
 556        gfs2_glock_dq_uninit_m(2, ghs);
 557
 558        d_instantiate(dentry, inode);
 559        mark_inode_dirty(inode);
 560
 561        return 0;
 562}
 563
 564/**
 565 * gfs2_rename - Rename a file
 566 * @odir: Parent directory of old file name
 567 * @odentry: The old dentry of the file
 568 * @ndir: Parent directory of new file name
 569 * @ndentry: The new dentry of the file
 570 *
 571 * Returns: errno
 572 */
 573
 574static int gfs2_rename(struct inode *odir, struct dentry *odentry,
 575                       struct inode *ndir, struct dentry *ndentry)
 576{
 577        struct gfs2_inode *odip = GFS2_I(odir);
 578        struct gfs2_inode *ndip = GFS2_I(ndir);
 579        struct gfs2_inode *ip = GFS2_I(odentry->d_inode);
 580        struct gfs2_inode *nip = NULL;
 581        struct gfs2_sbd *sdp = GFS2_SB(odir);
 582        struct gfs2_holder ghs[5], r_gh;
 583        struct gfs2_rgrpd *nrgd;
 584        unsigned int num_gh;
 585        int dir_rename = 0;
 586        int alloc_required;
 587        unsigned int x;
 588        int error;
 589
 590        if (ndentry->d_inode) {
 591                nip = GFS2_I(ndentry->d_inode);
 592                if (ip == nip)
 593                        return 0;
 594        }
 595
 596        /* Make sure we aren't trying to move a dirctory into it's subdir */
 597
 598        if (S_ISDIR(ip->i_inode.i_mode) && odip != ndip) {
 599                dir_rename = 1;
 600
 601                error = gfs2_glock_nq_init(sdp->sd_rename_gl, LM_ST_EXCLUSIVE, 0,
 602                                           &r_gh);
 603                if (error)
 604                        goto out;
 605
 606                error = gfs2_ok_to_move(ip, ndip);
 607                if (error)
 608                        goto out_gunlock_r;
 609        }
 610
 611        num_gh = 1;
 612        gfs2_holder_init(odip->i_gl, LM_ST_EXCLUSIVE, 0, ghs);
 613        if (odip != ndip) {
 614                gfs2_holder_init(ndip->i_gl, LM_ST_EXCLUSIVE, 0, ghs + num_gh);
 615                num_gh++;
 616        }
 617        gfs2_holder_init(ip->i_gl, LM_ST_EXCLUSIVE, 0, ghs + num_gh);
 618        num_gh++;
 619
 620        if (nip) {
 621                gfs2_holder_init(nip->i_gl, LM_ST_EXCLUSIVE, 0, ghs + num_gh);
 622                num_gh++;
 623                /* grab the resource lock for unlink flag twiddling 
 624                 * this is the case of the target file already existing
 625                 * so we unlink before doing the rename
 626                 */
 627                nrgd = gfs2_blk2rgrpd(sdp, nip->i_no_addr);
 628                if (nrgd)
 629                        gfs2_holder_init(nrgd->rd_gl, LM_ST_EXCLUSIVE, 0, ghs + num_gh++);
 630        }
 631
 632        error = gfs2_glock_nq_m(num_gh, ghs);
 633        if (error)
 634                goto out_uninit;
 635
 636        /* Check out the old directory */
 637
 638        error = gfs2_unlink_ok(odip, &odentry->d_name, ip);
 639        if (error)
 640                goto out_gunlock;
 641
 642        /* Check out the new directory */
 643
 644        if (nip) {
 645                error = gfs2_unlink_ok(ndip, &ndentry->d_name, nip);
 646                if (error)
 647                        goto out_gunlock;
 648
 649                if (S_ISDIR(nip->i_inode.i_mode)) {
 650                        if (nip->i_di.di_entries < 2) {
 651                                if (gfs2_consist_inode(nip))
 652                                        gfs2_dinode_print(nip);
 653                                error = -EIO;
 654                                goto out_gunlock;
 655                        }
 656                        if (nip->i_di.di_entries > 2) {
 657                                error = -ENOTEMPTY;
 658                                goto out_gunlock;
 659                        }
 660                }
 661        } else {
 662                error = permission(ndir, MAY_WRITE | MAY_EXEC, NULL);
 663                if (error)
 664                        goto out_gunlock;
 665
 666                error = gfs2_dir_check(ndir, &ndentry->d_name, NULL);
 667                switch (error) {
 668                case -ENOENT:
 669                        error = 0;
 670                        break;
 671                case 0:
 672                        error = -EEXIST;
 673                default:
 674                        goto out_gunlock;
 675                };
 676
 677                if (odip != ndip) {
 678                        if (!ndip->i_inode.i_nlink) {
 679                                error = -EINVAL;
 680                                goto out_gunlock;
 681                        }
 682                        if (ndip->i_di.di_entries == (u32)-1) {
 683                                error = -EFBIG;
 684                                goto out_gunlock;
 685                        }
 686                        if (S_ISDIR(ip->i_inode.i_mode) &&
 687                            ndip->i_inode.i_nlink == (u32)-1) {
 688                                error = -EMLINK;
 689                                goto out_gunlock;
 690                        }
 691                }
 692        }
 693
 694        /* Check out the dir to be renamed */
 695
 696        if (dir_rename) {
 697                error = permission(odentry->d_inode, MAY_WRITE, NULL);
 698                if (error)
 699                        goto out_gunlock;
 700        }
 701
 702        alloc_required = error = gfs2_diradd_alloc_required(ndir, &ndentry->d_name);
 703        if (error < 0)
 704                goto out_gunlock;
 705        error = 0;
 706
 707        if (alloc_required) {
 708                struct gfs2_alloc *al = gfs2_alloc_get(ndip);
 709
 710                error = gfs2_quota_lock(ndip, NO_QUOTA_CHANGE, NO_QUOTA_CHANGE);
 711                if (error)
 712                        goto out_alloc;
 713
 714                error = gfs2_quota_check(ndip, ndip->i_inode.i_uid, ndip->i_inode.i_gid);
 715                if (error)
 716                        goto out_gunlock_q;
 717
 718                al->al_requested = sdp->sd_max_dirres;
 719
 720                error = gfs2_inplace_reserve(ndip);
 721                if (error)
 722                        goto out_gunlock_q;
 723
 724                error = gfs2_trans_begin(sdp, sdp->sd_max_dirres +
 725                                         al->al_rgd->rd_length +
 726                                         4 * RES_DINODE + 4 * RES_LEAF +
 727                                         RES_STATFS + RES_QUOTA + 4, 0);
 728                if (error)
 729                        goto out_ipreserv;
 730        } else {
 731                error = gfs2_trans_begin(sdp, 4 * RES_DINODE +
 732                                         5 * RES_LEAF + 4, 0);
 733                if (error)
 734                        goto out_gunlock;
 735        }
 736
 737        /* Remove the target file, if it exists */
 738
 739        if (nip) {
 740                if (S_ISDIR(nip->i_inode.i_mode))
 741                        error = gfs2_rmdiri(ndip, &ndentry->d_name, nip);
 742                else {
 743                        error = gfs2_dir_del(ndip, &ndentry->d_name);
 744                        if (error)
 745                                goto out_end_trans;
 746                        error = gfs2_change_nlink(nip, -1);
 747                }
 748                if (error)
 749                        goto out_end_trans;
 750        }
 751
 752        if (dir_rename) {
 753                struct qstr name;
 754                gfs2_str2qstr(&name, "..");
 755
 756                error = gfs2_change_nlink(ndip, +1);
 757                if (error)
 758                        goto out_end_trans;
 759                error = gfs2_change_nlink(odip, -1);
 760                if (error)
 761                        goto out_end_trans;
 762
 763                error = gfs2_dir_mvino(ip, &name, ndip, DT_DIR);
 764                if (error)
 765                        goto out_end_trans;
 766        } else {
 767                struct buffer_head *dibh;
 768                error = gfs2_meta_inode_buffer(ip, &dibh);
 769                if (error)
 770                        goto out_end_trans;
 771                ip->i_inode.i_ctime = CURRENT_TIME;
 772                gfs2_trans_add_bh(ip->i_gl, dibh, 1);
 773                gfs2_dinode_out(ip, dibh->b_data);
 774                brelse(dibh);
 775        }
 776
 777        error = gfs2_dir_del(odip, &odentry->d_name);
 778        if (error)
 779                goto out_end_trans;
 780
 781        error = gfs2_dir_add(ndir, &ndentry->d_name, ip, IF2DT(ip->i_inode.i_mode));
 782        if (error)
 783                goto out_end_trans;
 784
 785out_end_trans:
 786        gfs2_trans_end(sdp);
 787out_ipreserv:
 788        if (alloc_required)
 789                gfs2_inplace_release(ndip);
 790out_gunlock_q:
 791        if (alloc_required)
 792                gfs2_quota_unlock(ndip);
 793out_alloc:
 794        if (alloc_required)
 795                gfs2_alloc_put(ndip);
 796out_gunlock:
 797        gfs2_glock_dq_m(num_gh, ghs);
 798out_uninit:
 799        for (x = 0; x < num_gh; x++)
 800                gfs2_holder_uninit(ghs + x);
 801out_gunlock_r:
 802        if (dir_rename)
 803                gfs2_glock_dq_uninit(&r_gh);
 804out:
 805        return error;
 806}
 807
 808/**
 809 * gfs2_readlink - Read the value of a symlink
 810 * @dentry: the symlink
 811 * @buf: the buffer to read the symlink data into
 812 * @size: the size of the buffer
 813 *
 814 * Returns: errno
 815 */
 816
 817static int gfs2_readlink(struct dentry *dentry, char __user *user_buf,
 818                         int user_size)
 819{
 820        struct gfs2_inode *ip = GFS2_I(dentry->d_inode);
 821        char array[GFS2_FAST_NAME_SIZE], *buf = array;
 822        unsigned int len = GFS2_FAST_NAME_SIZE;
 823        int error;
 824
 825        error = gfs2_readlinki(ip, &buf, &len);
 826        if (error)
 827                return error;
 828
 829        if (user_size > len - 1)
 830                user_size = len - 1;
 831
 832        if (copy_to_user(user_buf, buf, user_size))
 833                error = -EFAULT;
 834        else
 835                error = user_size;
 836
 837        if (buf != array)
 838                kfree(buf);
 839
 840        return error;
 841}
 842
 843/**
 844 * gfs2_follow_link - Follow a symbolic link
 845 * @dentry: The dentry of the link
 846 * @nd: Data that we pass to vfs_follow_link()
 847 *
 848 * This can handle symlinks of any size. It is optimised for symlinks
 849 * under GFS2_FAST_NAME_SIZE.
 850 *
 851 * Returns: 0 on success or error code
 852 */
 853
 854static void *gfs2_follow_link(struct dentry *dentry, struct nameidata *nd)
 855{
 856        struct gfs2_inode *ip = GFS2_I(dentry->d_inode);
 857        char array[GFS2_FAST_NAME_SIZE], *buf = array;
 858        unsigned int len = GFS2_FAST_NAME_SIZE;
 859        int error;
 860
 861        error = gfs2_readlinki(ip, &buf, &len);
 862        if (!error) {
 863                error = vfs_follow_link(nd, buf);
 864                if (buf != array)
 865                        kfree(buf);
 866        }
 867
 868        return ERR_PTR(error);
 869}
 870
 871/**
 872 * gfs2_permission -
 873 * @inode:
 874 * @mask:
 875 * @nd: passed from Linux VFS, ignored by us
 876 *
 877 * This may be called from the VFS directly, or from within GFS2 with the
 878 * inode locked, so we look to see if the glock is already locked and only
 879 * lock the glock if its not already been done.
 880 *
 881 * Returns: errno
 882 */
 883
 884static int gfs2_permission(struct inode *inode, int mask, struct nameidata *nd)
 885{
 886        struct gfs2_inode *ip = GFS2_I(inode);
 887        struct gfs2_holder i_gh;
 888        int error;
 889        int unlock = 0;
 890
 891        if (gfs2_glock_is_locked_by_me(ip->i_gl) == 0) {
 892                error = gfs2_glock_nq_init(ip->i_gl, LM_ST_SHARED, LM_FLAG_ANY, &i_gh);
 893                if (error)
 894                        return error;
 895                unlock = 1;
 896        }
 897
 898        error = generic_permission(inode, mask, gfs2_check_acl);
 899        if (unlock)
 900                gfs2_glock_dq_uninit(&i_gh);
 901
 902        return error;
 903}
 904
 905static int setattr_size(struct inode *inode, struct iattr *attr)
 906{
 907        struct gfs2_inode *ip = GFS2_I(inode);
 908        struct gfs2_sbd *sdp = GFS2_SB(inode);
 909        int error;
 910
 911        if (attr->ia_size != ip->i_di.di_size) {
 912                error = gfs2_trans_begin(sdp, 0, sdp->sd_jdesc->jd_blocks);
 913                if (error)
 914                        return error;
 915                error = vmtruncate(inode, attr->ia_size);
 916                gfs2_trans_end(sdp);
 917                if (error) 
 918                        return error;
 919        }
 920
 921        error = gfs2_truncatei(ip, attr->ia_size);
 922        if (error && (inode->i_size != ip->i_di.di_size))
 923                i_size_write(inode, ip->i_di.di_size);
 924
 925        return error;
 926}
 927
 928static int setattr_chown(struct inode *inode, struct iattr *attr)
 929{
 930        struct gfs2_inode *ip = GFS2_I(inode);
 931        struct gfs2_sbd *sdp = GFS2_SB(inode);
 932        struct buffer_head *dibh;
 933        u32 ouid, ogid, nuid, ngid;
 934        int error;
 935
 936        ouid = inode->i_uid;
 937        ogid = inode->i_gid;
 938        nuid = attr->ia_uid;
 939        ngid = attr->ia_gid;
 940
 941        if (!(attr->ia_valid & ATTR_UID) || ouid == nuid)
 942                ouid = nuid = NO_QUOTA_CHANGE;
 943        if (!(attr->ia_valid & ATTR_GID) || ogid == ngid)
 944                ogid = ngid = NO_QUOTA_CHANGE;
 945
 946        gfs2_alloc_get(ip);
 947
 948        error = gfs2_quota_lock(ip, nuid, ngid);
 949        if (error)
 950                goto out_alloc;
 951
 952        if (ouid != NO_QUOTA_CHANGE || ogid != NO_QUOTA_CHANGE) {
 953                error = gfs2_quota_check(ip, nuid, ngid);
 954                if (error)
 955                        goto out_gunlock_q;
 956        }
 957
 958        error = gfs2_trans_begin(sdp, RES_DINODE + 2 * RES_QUOTA, 0);
 959        if (error)
 960                goto out_gunlock_q;
 961
 962        error = gfs2_meta_inode_buffer(ip, &dibh);
 963        if (error)
 964                goto out_end_trans;
 965
 966        error = inode_setattr(inode, attr);
 967        gfs2_assert_warn(sdp, !error);
 968
 969        gfs2_trans_add_bh(ip->i_gl, dibh, 1);
 970        gfs2_dinode_out(ip, dibh->b_data);
 971        brelse(dibh);
 972
 973        if (ouid != NO_QUOTA_CHANGE || ogid != NO_QUOTA_CHANGE) {
 974                gfs2_quota_change(ip, -ip->i_di.di_blocks, ouid, ogid);
 975                gfs2_quota_change(ip, ip->i_di.di_blocks, nuid, ngid);
 976        }
 977
 978out_end_trans:
 979        gfs2_trans_end(sdp);
 980out_gunlock_q:
 981        gfs2_quota_unlock(ip);
 982out_alloc:
 983        gfs2_alloc_put(ip);
 984        return error;
 985}
 986
 987/**
 988 * gfs2_setattr - Change attributes on an inode
 989 * @dentry: The dentry which is changing
 990 * @attr: The structure describing the change
 991 *
 992 * The VFS layer wants to change one or more of an inodes attributes.  Write
 993 * that change out to disk.
 994 *
 995 * Returns: errno
 996 */
 997
 998static int gfs2_setattr(struct dentry *dentry, struct iattr *attr)
 999{
1000        struct inode *inode = dentry->d_inode;
1001        struct gfs2_inode *ip = GFS2_I(inode);
1002        struct gfs2_holder i_gh;
1003        int error;
1004
1005        error = gfs2_glock_nq_init(ip->i_gl, LM_ST_EXCLUSIVE, 0, &i_gh);
1006        if (error)
1007                return error;
1008
1009        error = -EPERM;
1010        if (IS_IMMUTABLE(inode) || IS_APPEND(inode))
1011                goto out;
1012
1013        error = inode_change_ok(inode, attr);
1014        if (error)
1015                goto out;
1016
1017        if (attr->ia_valid & ATTR_SIZE)
1018                error = setattr_size(inode, attr);
1019        else if (attr->ia_valid & (ATTR_UID | ATTR_GID))
1020                error = setattr_chown(inode, attr);
1021        else if ((attr->ia_valid & ATTR_MODE) && IS_POSIXACL(inode))
1022                error = gfs2_acl_chmod(ip, attr);
1023        else
1024                error = gfs2_setattr_simple(ip, attr);
1025
1026out:
1027        gfs2_glock_dq_uninit(&i_gh);
1028        if (!error)
1029                mark_inode_dirty(inode);
1030        return error;
1031}
1032
1033/**
1034 * gfs2_getattr - Read out an inode's attributes
1035 * @mnt: The vfsmount the inode is being accessed from
1036 * @dentry: The dentry to stat
1037 * @stat: The inode's stats
1038 *
1039 * This may be called from the VFS directly, or from within GFS2 with the
1040 * inode locked, so we look to see if the glock is already locked and only
1041 * lock the glock if its not already been done. Note that its the NFS
1042 * readdirplus operation which causes this to be called (from filldir)
1043 * with the glock already held.
1044 *
1045 * Returns: errno
1046 */
1047
1048static int gfs2_getattr(struct vfsmount *mnt, struct dentry *dentry,
1049                        struct kstat *stat)
1050{
1051        struct inode *inode = dentry->d_inode;
1052        struct gfs2_inode *ip = GFS2_I(inode);
1053        struct gfs2_holder gh;
1054        int error;
1055        int unlock = 0;
1056
1057        if (gfs2_glock_is_locked_by_me(ip->i_gl) == 0) {
1058                error = gfs2_glock_nq_init(ip->i_gl, LM_ST_SHARED, LM_FLAG_ANY, &gh);
1059                if (error)
1060                        return error;
1061                unlock = 1;
1062        }
1063
1064        generic_fillattr(inode, stat);
1065        if (unlock)
1066                gfs2_glock_dq_uninit(&gh);
1067
1068        return 0;
1069}
1070
1071static int gfs2_setxattr(struct dentry *dentry, const char *name,
1072                         const void *data, size_t size, int flags)
1073{
1074        struct inode *inode = dentry->d_inode;
1075        struct gfs2_ea_request er;
1076
1077        memset(&er, 0, sizeof(struct gfs2_ea_request));
1078        er.er_type = gfs2_ea_name2type(name, &er.er_name);
1079        if (er.er_type == GFS2_EATYPE_UNUSED)
1080                return -EOPNOTSUPP;
1081        er.er_data = (char *)data;
1082        er.er_name_len = strlen(er.er_name);
1083        er.er_data_len = size;
1084        er.er_flags = flags;
1085
1086        gfs2_assert_warn(GFS2_SB(inode), !(er.er_flags & GFS2_ERF_MODE));
1087
1088        return gfs2_ea_set(GFS2_I(inode), &er);
1089}
1090
1091static ssize_t gfs2_getxattr(struct dentry *dentry, const char *name,
1092                             void *data, size_t size)
1093{
1094        struct gfs2_ea_request er;
1095
1096        memset(&er, 0, sizeof(struct gfs2_ea_request));
1097        er.er_type = gfs2_ea_name2type(name, &er.er_name);
1098        if (er.er_type == GFS2_EATYPE_UNUSED)
1099                return -EOPNOTSUPP;
1100        er.er_data = data;
1101        er.er_name_len = strlen(er.er_name);
1102        er.er_data_len = size;
1103
1104        return gfs2_ea_get(GFS2_I(dentry->d_inode), &er);
1105}
1106
1107static ssize_t gfs2_listxattr(struct dentry *dentry, char *buffer, size_t size)
1108{
1109        struct gfs2_ea_request er;
1110
1111        memset(&er, 0, sizeof(struct gfs2_ea_request));
1112        er.er_data = (size) ? buffer : NULL;
1113        er.er_data_len = size;
1114
1115        return gfs2_ea_list(GFS2_I(dentry->d_inode), &er);
1116}
1117
1118static int gfs2_removexattr(struct dentry *dentry, const char *name)
1119{
1120        struct gfs2_ea_request er;
1121
1122        memset(&er, 0, sizeof(struct gfs2_ea_request));
1123        er.er_type = gfs2_ea_name2type(name, &er.er_name);
1124        if (er.er_type == GFS2_EATYPE_UNUSED)
1125                return -EOPNOTSUPP;
1126        er.er_name_len = strlen(er.er_name);
1127
1128        return gfs2_ea_remove(GFS2_I(dentry->d_inode), &er);
1129}
1130
1131const struct inode_operations gfs2_file_iops = {
1132        .permission = gfs2_permission,
1133        .setattr = gfs2_setattr,
1134        .getattr = gfs2_getattr,
1135        .setxattr = gfs2_setxattr,
1136        .getxattr = gfs2_getxattr,
1137        .listxattr = gfs2_listxattr,
1138        .removexattr = gfs2_removexattr,
1139};
1140
1141const struct inode_operations gfs2_dev_iops = {
1142        .permission = gfs2_permission,
1143        .setattr = gfs2_setattr,
1144        .getattr = gfs2_getattr,
1145        .setxattr = gfs2_setxattr,
1146        .getxattr = gfs2_getxattr,
1147        .listxattr = gfs2_listxattr,
1148        .removexattr = gfs2_removexattr,
1149};
1150
1151const struct inode_operations gfs2_dir_iops = {
1152        .create = gfs2_create,
1153        .lookup = gfs2_lookup,
1154        .link = gfs2_link,
1155        .unlink = gfs2_unlink,
1156        .symlink = gfs2_symlink,
1157        .mkdir = gfs2_mkdir,
1158        .rmdir = gfs2_rmdir,
1159        .mknod = gfs2_mknod,
1160        .rename = gfs2_rename,
1161        .permission = gfs2_permission,
1162        .setattr = gfs2_setattr,
1163        .getattr = gfs2_getattr,
1164        .setxattr = gfs2_setxattr,
1165        .getxattr = gfs2_getxattr,
1166        .listxattr = gfs2_listxattr,
1167        .removexattr = gfs2_removexattr,
1168};
1169
1170const struct inode_operations gfs2_symlink_iops = {
1171        .readlink = gfs2_readlink,
1172        .follow_link = gfs2_follow_link,
1173        .permission = gfs2_permission,
1174        .setattr = gfs2_setattr,
1175        .getattr = gfs2_getattr,
1176        .setxattr = gfs2_setxattr,
1177        .getxattr = gfs2_getxattr,
1178        .listxattr = gfs2_listxattr,
1179        .removexattr = gfs2_removexattr,
1180};
1181
1182