linux/fs/xfs/xfs_iops.c
<<
>>
Prefs
   1/*
   2 * Copyright (c) 2000-2005 Silicon Graphics, Inc.
   3 * All Rights Reserved.
   4 *
   5 * This program is free software; you can redistribute it and/or
   6 * modify it under the terms of the GNU General Public License as
   7 * published by the Free Software Foundation.
   8 *
   9 * This program is distributed in the hope that it would be useful,
  10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
  11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  12 * GNU General Public License for more details.
  13 *
  14 * You should have received a copy of the GNU General Public License
  15 * along with this program; if not, write the Free Software Foundation,
  16 * Inc.,  51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
  17 */
  18#include "xfs.h"
  19#include "xfs_fs.h"
  20#include "xfs_acl.h"
  21#include "xfs_log.h"
  22#include "xfs_trans.h"
  23#include "xfs_sb.h"
  24#include "xfs_ag.h"
  25#include "xfs_alloc.h"
  26#include "xfs_quota.h"
  27#include "xfs_mount.h"
  28#include "xfs_bmap_btree.h"
  29#include "xfs_dinode.h"
  30#include "xfs_inode.h"
  31#include "xfs_bmap.h"
  32#include "xfs_rtalloc.h"
  33#include "xfs_error.h"
  34#include "xfs_itable.h"
  35#include "xfs_attr.h"
  36#include "xfs_buf_item.h"
  37#include "xfs_utils.h"
  38#include "xfs_vnodeops.h"
  39#include "xfs_inode_item.h"
  40#include "xfs_trace.h"
  41#include "xfs_icache.h"
  42
  43#include <linux/capability.h>
  44#include <linux/xattr.h>
  45#include <linux/namei.h>
  46#include <linux/posix_acl.h>
  47#include <linux/security.h>
  48#include <linux/fiemap.h>
  49#include <linux/slab.h>
  50
  51static int
  52xfs_initxattrs(
  53        struct inode            *inode,
  54        const struct xattr      *xattr_array,
  55        void                    *fs_info)
  56{
  57        const struct xattr      *xattr;
  58        struct xfs_inode        *ip = XFS_I(inode);
  59        int                     error = 0;
  60
  61        for (xattr = xattr_array; xattr->name != NULL; xattr++) {
  62                error = xfs_attr_set(ip, xattr->name, xattr->value,
  63                                     xattr->value_len, ATTR_SECURE);
  64                if (error < 0)
  65                        break;
  66        }
  67        return error;
  68}
  69
  70/*
  71 * Hook in SELinux.  This is not quite correct yet, what we really need
  72 * here (as we do for default ACLs) is a mechanism by which creation of
  73 * these attrs can be journalled at inode creation time (along with the
  74 * inode, of course, such that log replay can't cause these to be lost).
  75 */
  76
  77STATIC int
  78xfs_init_security(
  79        struct inode    *inode,
  80        struct inode    *dir,
  81        const struct qstr *qstr)
  82{
  83        return security_inode_init_security(inode, dir, qstr,
  84                                            &xfs_initxattrs, NULL);
  85}
  86
  87static void
  88xfs_dentry_to_name(
  89        struct xfs_name *namep,
  90        struct dentry   *dentry)
  91{
  92        namep->name = dentry->d_name.name;
  93        namep->len = dentry->d_name.len;
  94}
  95
  96STATIC void
  97xfs_cleanup_inode(
  98        struct inode    *dir,
  99        struct inode    *inode,
 100        struct dentry   *dentry)
 101{
 102        struct xfs_name teardown;
 103
 104        /* Oh, the horror.
 105         * If we can't add the ACL or we fail in
 106         * xfs_init_security we must back out.
 107         * ENOSPC can hit here, among other things.
 108         */
 109        xfs_dentry_to_name(&teardown, dentry);
 110
 111        xfs_remove(XFS_I(dir), &teardown, XFS_I(inode));
 112        iput(inode);
 113}
 114
 115STATIC int
 116xfs_vn_mknod(
 117        struct inode    *dir,
 118        struct dentry   *dentry,
 119        umode_t         mode,
 120        dev_t           rdev)
 121{
 122        struct inode    *inode;
 123        struct xfs_inode *ip = NULL;
 124        struct posix_acl *default_acl = NULL;
 125        struct xfs_name name;
 126        int             error;
 127
 128        /*
 129         * Irix uses Missed'em'V split, but doesn't want to see
 130         * the upper 5 bits of (14bit) major.
 131         */
 132        if (S_ISCHR(mode) || S_ISBLK(mode)) {
 133                if (unlikely(!sysv_valid_dev(rdev) || MAJOR(rdev) & ~0x1ff))
 134                        return -EINVAL;
 135                rdev = sysv_encode_dev(rdev);
 136        } else {
 137                rdev = 0;
 138        }
 139
 140        if (IS_POSIXACL(dir)) {
 141                default_acl = xfs_get_acl(dir, ACL_TYPE_DEFAULT);
 142                if (IS_ERR(default_acl))
 143                        return PTR_ERR(default_acl);
 144
 145                if (!default_acl)
 146                        mode &= ~current_umask();
 147        }
 148
 149        xfs_dentry_to_name(&name, dentry);
 150        error = xfs_create(XFS_I(dir), &name, mode, rdev, &ip);
 151        if (unlikely(error))
 152                goto out_free_acl;
 153
 154        inode = VFS_I(ip);
 155
 156        error = xfs_init_security(inode, dir, &dentry->d_name);
 157        if (unlikely(error))
 158                goto out_cleanup_inode;
 159
 160        if (default_acl) {
 161                error = -xfs_inherit_acl(inode, default_acl);
 162                default_acl = NULL;
 163                if (unlikely(error))
 164                        goto out_cleanup_inode;
 165        }
 166
 167
 168        d_instantiate(dentry, inode);
 169        return -error;
 170
 171 out_cleanup_inode:
 172        xfs_cleanup_inode(dir, inode, dentry);
 173 out_free_acl:
 174        posix_acl_release(default_acl);
 175        return -error;
 176}
 177
 178STATIC int
 179xfs_vn_create(
 180        struct inode    *dir,
 181        struct dentry   *dentry,
 182        umode_t         mode,
 183        bool            flags)
 184{
 185        return xfs_vn_mknod(dir, dentry, mode, 0);
 186}
 187
 188STATIC int
 189xfs_vn_mkdir(
 190        struct inode    *dir,
 191        struct dentry   *dentry,
 192        umode_t         mode)
 193{
 194        return xfs_vn_mknod(dir, dentry, mode|S_IFDIR, 0);
 195}
 196
 197STATIC struct dentry *
 198xfs_vn_lookup(
 199        struct inode    *dir,
 200        struct dentry   *dentry,
 201        unsigned int flags)
 202{
 203        struct xfs_inode *cip;
 204        struct xfs_name name;
 205        int             error;
 206
 207        if (dentry->d_name.len >= MAXNAMELEN)
 208                return ERR_PTR(-ENAMETOOLONG);
 209
 210        xfs_dentry_to_name(&name, dentry);
 211        error = xfs_lookup(XFS_I(dir), &name, &cip, NULL);
 212        if (unlikely(error)) {
 213                if (unlikely(error != ENOENT))
 214                        return ERR_PTR(-error);
 215                d_add(dentry, NULL);
 216                return NULL;
 217        }
 218
 219        return d_splice_alias(VFS_I(cip), dentry);
 220}
 221
 222STATIC struct dentry *
 223xfs_vn_ci_lookup(
 224        struct inode    *dir,
 225        struct dentry   *dentry,
 226        unsigned int flags)
 227{
 228        struct xfs_inode *ip;
 229        struct xfs_name xname;
 230        struct xfs_name ci_name;
 231        struct qstr     dname;
 232        int             error;
 233
 234        if (dentry->d_name.len >= MAXNAMELEN)
 235                return ERR_PTR(-ENAMETOOLONG);
 236
 237        xfs_dentry_to_name(&xname, dentry);
 238        error = xfs_lookup(XFS_I(dir), &xname, &ip, &ci_name);
 239        if (unlikely(error)) {
 240                if (unlikely(error != ENOENT))
 241                        return ERR_PTR(-error);
 242                /*
 243                 * call d_add(dentry, NULL) here when d_drop_negative_children
 244                 * is called in xfs_vn_mknod (ie. allow negative dentries
 245                 * with CI filesystems).
 246                 */
 247                return NULL;
 248        }
 249
 250        /* if exact match, just splice and exit */
 251        if (!ci_name.name)
 252                return d_splice_alias(VFS_I(ip), dentry);
 253
 254        /* else case-insensitive match... */
 255        dname.name = ci_name.name;
 256        dname.len = ci_name.len;
 257        dentry = d_add_ci(dentry, VFS_I(ip), &dname);
 258        kmem_free(ci_name.name);
 259        return dentry;
 260}
 261
 262STATIC int
 263xfs_vn_link(
 264        struct dentry   *old_dentry,
 265        struct inode    *dir,
 266        struct dentry   *dentry)
 267{
 268        struct inode    *inode = old_dentry->d_inode;
 269        struct xfs_name name;
 270        int             error;
 271
 272        xfs_dentry_to_name(&name, dentry);
 273
 274        error = xfs_link(XFS_I(dir), XFS_I(inode), &name);
 275        if (unlikely(error))
 276                return -error;
 277
 278        ihold(inode);
 279        d_instantiate(dentry, inode);
 280        return 0;
 281}
 282
 283STATIC int
 284xfs_vn_unlink(
 285        struct inode    *dir,
 286        struct dentry   *dentry)
 287{
 288        struct xfs_name name;
 289        int             error;
 290
 291        xfs_dentry_to_name(&name, dentry);
 292
 293        error = -xfs_remove(XFS_I(dir), &name, XFS_I(dentry->d_inode));
 294        if (error)
 295                return error;
 296
 297        /*
 298         * With unlink, the VFS makes the dentry "negative": no inode,
 299         * but still hashed. This is incompatible with case-insensitive
 300         * mode, so invalidate (unhash) the dentry in CI-mode.
 301         */
 302        if (xfs_sb_version_hasasciici(&XFS_M(dir->i_sb)->m_sb))
 303                d_invalidate(dentry);
 304        return 0;
 305}
 306
 307STATIC int
 308xfs_vn_symlink(
 309        struct inode    *dir,
 310        struct dentry   *dentry,
 311        const char      *symname)
 312{
 313        struct inode    *inode;
 314        struct xfs_inode *cip = NULL;
 315        struct xfs_name name;
 316        int             error;
 317        umode_t         mode;
 318
 319        mode = S_IFLNK |
 320                (irix_symlink_mode ? 0777 & ~current_umask() : S_IRWXUGO);
 321        xfs_dentry_to_name(&name, dentry);
 322
 323        error = xfs_symlink(XFS_I(dir), &name, symname, mode, &cip);
 324        if (unlikely(error))
 325                goto out;
 326
 327        inode = VFS_I(cip);
 328
 329        error = xfs_init_security(inode, dir, &dentry->d_name);
 330        if (unlikely(error))
 331                goto out_cleanup_inode;
 332
 333        d_instantiate(dentry, inode);
 334        return 0;
 335
 336 out_cleanup_inode:
 337        xfs_cleanup_inode(dir, inode, dentry);
 338 out:
 339        return -error;
 340}
 341
 342STATIC int
 343xfs_vn_rename(
 344        struct inode    *odir,
 345        struct dentry   *odentry,
 346        struct inode    *ndir,
 347        struct dentry   *ndentry)
 348{
 349        struct inode    *new_inode = ndentry->d_inode;
 350        struct xfs_name oname;
 351        struct xfs_name nname;
 352
 353        xfs_dentry_to_name(&oname, odentry);
 354        xfs_dentry_to_name(&nname, ndentry);
 355
 356        return -xfs_rename(XFS_I(odir), &oname, XFS_I(odentry->d_inode),
 357                           XFS_I(ndir), &nname, new_inode ?
 358                                                XFS_I(new_inode) : NULL);
 359}
 360
 361/*
 362 * careful here - this function can get called recursively, so
 363 * we need to be very careful about how much stack we use.
 364 * uio is kmalloced for this reason...
 365 */
 366STATIC void *
 367xfs_vn_follow_link(
 368        struct dentry           *dentry,
 369        struct nameidata        *nd)
 370{
 371        char                    *link;
 372        int                     error = -ENOMEM;
 373
 374        link = kmalloc(MAXPATHLEN+1, GFP_KERNEL);
 375        if (!link)
 376                goto out_err;
 377
 378        error = -xfs_readlink(XFS_I(dentry->d_inode), link);
 379        if (unlikely(error))
 380                goto out_kfree;
 381
 382        nd_set_link(nd, link);
 383        return NULL;
 384
 385 out_kfree:
 386        kfree(link);
 387 out_err:
 388        nd_set_link(nd, ERR_PTR(error));
 389        return NULL;
 390}
 391
 392STATIC void
 393xfs_vn_put_link(
 394        struct dentry   *dentry,
 395        struct nameidata *nd,
 396        void            *p)
 397{
 398        char            *s = nd_get_link(nd);
 399
 400        if (!IS_ERR(s))
 401                kfree(s);
 402}
 403
 404STATIC int
 405xfs_vn_getattr(
 406        struct vfsmount         *mnt,
 407        struct dentry           *dentry,
 408        struct kstat            *stat)
 409{
 410        struct inode            *inode = dentry->d_inode;
 411        struct xfs_inode        *ip = XFS_I(inode);
 412        struct xfs_mount        *mp = ip->i_mount;
 413
 414        trace_xfs_getattr(ip);
 415
 416        if (XFS_FORCED_SHUTDOWN(mp))
 417                return -XFS_ERROR(EIO);
 418
 419        stat->size = XFS_ISIZE(ip);
 420        stat->dev = inode->i_sb->s_dev;
 421        stat->mode = ip->i_d.di_mode;
 422        stat->nlink = ip->i_d.di_nlink;
 423        stat->uid = ip->i_d.di_uid;
 424        stat->gid = ip->i_d.di_gid;
 425        stat->ino = ip->i_ino;
 426        stat->atime = inode->i_atime;
 427        stat->mtime = inode->i_mtime;
 428        stat->ctime = inode->i_ctime;
 429        stat->blocks =
 430                XFS_FSB_TO_BB(mp, ip->i_d.di_nblocks + ip->i_delayed_blks);
 431
 432
 433        switch (inode->i_mode & S_IFMT) {
 434        case S_IFBLK:
 435        case S_IFCHR:
 436                stat->blksize = BLKDEV_IOSIZE;
 437                stat->rdev = MKDEV(sysv_major(ip->i_df.if_u2.if_rdev) & 0x1ff,
 438                                   sysv_minor(ip->i_df.if_u2.if_rdev));
 439                break;
 440        default:
 441                if (XFS_IS_REALTIME_INODE(ip)) {
 442                        /*
 443                         * If the file blocks are being allocated from a
 444                         * realtime volume, then return the inode's realtime
 445                         * extent size or the realtime volume's extent size.
 446                         */
 447                        stat->blksize =
 448                                xfs_get_extsz_hint(ip) << mp->m_sb.sb_blocklog;
 449                } else
 450                        stat->blksize = xfs_preferred_iosize(mp);
 451                stat->rdev = 0;
 452                break;
 453        }
 454
 455        return 0;
 456}
 457
 458int
 459xfs_setattr_nonsize(
 460        struct xfs_inode        *ip,
 461        struct iattr            *iattr,
 462        int                     flags)
 463{
 464        xfs_mount_t             *mp = ip->i_mount;
 465        struct inode            *inode = VFS_I(ip);
 466        int                     mask = iattr->ia_valid;
 467        xfs_trans_t             *tp;
 468        int                     error;
 469        uid_t                   uid = 0, iuid = 0;
 470        gid_t                   gid = 0, igid = 0;
 471        struct xfs_dquot        *udqp = NULL, *gdqp = NULL;
 472        struct xfs_dquot        *olddquot1 = NULL, *olddquot2 = NULL;
 473
 474        trace_xfs_setattr(ip);
 475
 476        if (mp->m_flags & XFS_MOUNT_RDONLY)
 477                return XFS_ERROR(EROFS);
 478
 479        if (XFS_FORCED_SHUTDOWN(mp))
 480                return XFS_ERROR(EIO);
 481
 482        error = -inode_change_ok(inode, iattr);
 483        if (error)
 484                return XFS_ERROR(error);
 485
 486        ASSERT((mask & ATTR_SIZE) == 0);
 487
 488        /*
 489         * If disk quotas is on, we make sure that the dquots do exist on disk,
 490         * before we start any other transactions. Trying to do this later
 491         * is messy. We don't care to take a readlock to look at the ids
 492         * in inode here, because we can't hold it across the trans_reserve.
 493         * If the IDs do change before we take the ilock, we're covered
 494         * because the i_*dquot fields will get updated anyway.
 495         */
 496        if (XFS_IS_QUOTA_ON(mp) && (mask & (ATTR_UID|ATTR_GID))) {
 497                uint    qflags = 0;
 498
 499                if ((mask & ATTR_UID) && XFS_IS_UQUOTA_ON(mp)) {
 500                        uid = iattr->ia_uid;
 501                        qflags |= XFS_QMOPT_UQUOTA;
 502                } else {
 503                        uid = ip->i_d.di_uid;
 504                }
 505                if ((mask & ATTR_GID) && XFS_IS_GQUOTA_ON(mp)) {
 506                        gid = iattr->ia_gid;
 507                        qflags |= XFS_QMOPT_GQUOTA;
 508                }  else {
 509                        gid = ip->i_d.di_gid;
 510                }
 511
 512                /*
 513                 * We take a reference when we initialize udqp and gdqp,
 514                 * so it is important that we never blindly double trip on
 515                 * the same variable. See xfs_create() for an example.
 516                 */
 517                ASSERT(udqp == NULL);
 518                ASSERT(gdqp == NULL);
 519                error = xfs_qm_vop_dqalloc(ip, uid, gid, xfs_get_projid(ip),
 520                                         qflags, &udqp, &gdqp);
 521                if (error)
 522                        return error;
 523        }
 524
 525        tp = xfs_trans_alloc(mp, XFS_TRANS_SETATTR_NOT_SIZE);
 526        error = xfs_trans_reserve(tp, 0, XFS_ICHANGE_LOG_RES(mp), 0, 0, 0);
 527        if (error)
 528                goto out_dqrele;
 529
 530        xfs_ilock(ip, XFS_ILOCK_EXCL);
 531
 532        /*
 533         * Change file ownership.  Must be the owner or privileged.
 534         */
 535        if (mask & (ATTR_UID|ATTR_GID)) {
 536                /*
 537                 * These IDs could have changed since we last looked at them.
 538                 * But, we're assured that if the ownership did change
 539                 * while we didn't have the inode locked, inode's dquot(s)
 540                 * would have changed also.
 541                 */
 542                iuid = ip->i_d.di_uid;
 543                igid = ip->i_d.di_gid;
 544                gid = (mask & ATTR_GID) ? iattr->ia_gid : igid;
 545                uid = (mask & ATTR_UID) ? iattr->ia_uid : iuid;
 546
 547                /*
 548                 * Do a quota reservation only if uid/gid is actually
 549                 * going to change.
 550                 */
 551                if (XFS_IS_QUOTA_RUNNING(mp) &&
 552                    ((XFS_IS_UQUOTA_ON(mp) && iuid != uid) ||
 553                     (XFS_IS_GQUOTA_ON(mp) && igid != gid))) {
 554                        ASSERT(tp);
 555                        error = xfs_qm_vop_chown_reserve(tp, ip, udqp, gdqp,
 556                                                capable(CAP_FOWNER) ?
 557                                                XFS_QMOPT_FORCE_RES : 0);
 558                        if (error)      /* out of quota */
 559                                goto out_trans_cancel;
 560                }
 561        }
 562
 563        xfs_trans_ijoin(tp, ip, 0);
 564
 565        /*
 566         * Change file ownership.  Must be the owner or privileged.
 567         */
 568        if (mask & (ATTR_UID|ATTR_GID)) {
 569                /*
 570                 * CAP_FSETID overrides the following restrictions:
 571                 *
 572                 * The set-user-ID and set-group-ID bits of a file will be
 573                 * cleared upon successful return from chown()
 574                 */
 575                if ((ip->i_d.di_mode & (S_ISUID|S_ISGID)) &&
 576                    !capable(CAP_FSETID))
 577                        ip->i_d.di_mode &= ~(S_ISUID|S_ISGID);
 578
 579                /*
 580                 * Change the ownerships and register quota modifications
 581                 * in the transaction.
 582                 */
 583                if (iuid != uid) {
 584                        if (XFS_IS_QUOTA_RUNNING(mp) && XFS_IS_UQUOTA_ON(mp)) {
 585                                ASSERT(mask & ATTR_UID);
 586                                ASSERT(udqp);
 587                                olddquot1 = xfs_qm_vop_chown(tp, ip,
 588                                                        &ip->i_udquot, udqp);
 589                        }
 590                        ip->i_d.di_uid = uid;
 591                        inode->i_uid = uid;
 592                }
 593                if (igid != gid) {
 594                        if (XFS_IS_QUOTA_RUNNING(mp) && XFS_IS_GQUOTA_ON(mp)) {
 595                                ASSERT(!XFS_IS_PQUOTA_ON(mp));
 596                                ASSERT(mask & ATTR_GID);
 597                                ASSERT(gdqp);
 598                                olddquot2 = xfs_qm_vop_chown(tp, ip,
 599                                                        &ip->i_gdquot, gdqp);
 600                        }
 601                        ip->i_d.di_gid = gid;
 602                        inode->i_gid = gid;
 603                }
 604        }
 605
 606        /*
 607         * Change file access modes.
 608         */
 609        if (mask & ATTR_MODE) {
 610                umode_t mode = iattr->ia_mode;
 611
 612                if (!in_group_p(inode->i_gid) && !capable(CAP_FSETID))
 613                        mode &= ~S_ISGID;
 614
 615                ip->i_d.di_mode &= S_IFMT;
 616                ip->i_d.di_mode |= mode & ~S_IFMT;
 617
 618                inode->i_mode &= S_IFMT;
 619                inode->i_mode |= mode & ~S_IFMT;
 620        }
 621
 622        /*
 623         * Change file access or modified times.
 624         */
 625        if (mask & ATTR_ATIME) {
 626                inode->i_atime = iattr->ia_atime;
 627                ip->i_d.di_atime.t_sec = iattr->ia_atime.tv_sec;
 628                ip->i_d.di_atime.t_nsec = iattr->ia_atime.tv_nsec;
 629        }
 630        if (mask & ATTR_CTIME) {
 631                inode->i_ctime = iattr->ia_ctime;
 632                ip->i_d.di_ctime.t_sec = iattr->ia_ctime.tv_sec;
 633                ip->i_d.di_ctime.t_nsec = iattr->ia_ctime.tv_nsec;
 634        }
 635        if (mask & ATTR_MTIME) {
 636                inode->i_mtime = iattr->ia_mtime;
 637                ip->i_d.di_mtime.t_sec = iattr->ia_mtime.tv_sec;
 638                ip->i_d.di_mtime.t_nsec = iattr->ia_mtime.tv_nsec;
 639        }
 640
 641        xfs_trans_log_inode(tp, ip, XFS_ILOG_CORE);
 642
 643        XFS_STATS_INC(xs_ig_attrchg);
 644
 645        if (mp->m_flags & XFS_MOUNT_WSYNC)
 646                xfs_trans_set_sync(tp);
 647        error = xfs_trans_commit(tp, 0);
 648
 649        xfs_iunlock(ip, XFS_ILOCK_EXCL);
 650
 651        /*
 652         * Release any dquot(s) the inode had kept before chown.
 653         */
 654        xfs_qm_dqrele(olddquot1);
 655        xfs_qm_dqrele(olddquot2);
 656        xfs_qm_dqrele(udqp);
 657        xfs_qm_dqrele(gdqp);
 658
 659        if (error)
 660                return XFS_ERROR(error);
 661
 662        /*
 663         * XXX(hch): Updating the ACL entries is not atomic vs the i_mode
 664         *           update.  We could avoid this with linked transactions
 665         *           and passing down the transaction pointer all the way
 666         *           to attr_set.  No previous user of the generic
 667         *           Posix ACL code seems to care about this issue either.
 668         */
 669        if ((mask & ATTR_MODE) && !(flags & XFS_ATTR_NOACL)) {
 670                error = -xfs_acl_chmod(inode);
 671                if (error)
 672                        return XFS_ERROR(error);
 673        }
 674
 675        return 0;
 676
 677out_trans_cancel:
 678        xfs_trans_cancel(tp, 0);
 679        xfs_iunlock(ip, XFS_ILOCK_EXCL);
 680out_dqrele:
 681        xfs_qm_dqrele(udqp);
 682        xfs_qm_dqrele(gdqp);
 683        return error;
 684}
 685
 686/*
 687 * Truncate file.  Must have write permission and not be a directory.
 688 */
 689int
 690xfs_setattr_size(
 691        struct xfs_inode        *ip,
 692        struct iattr            *iattr,
 693        int                     flags)
 694{
 695        struct xfs_mount        *mp = ip->i_mount;
 696        struct inode            *inode = VFS_I(ip);
 697        int                     mask = iattr->ia_valid;
 698        xfs_off_t               oldsize, newsize;
 699        struct xfs_trans        *tp;
 700        int                     error;
 701        uint                    lock_flags = 0;
 702        uint                    commit_flags = 0;
 703
 704        trace_xfs_setattr(ip);
 705
 706        if (mp->m_flags & XFS_MOUNT_RDONLY)
 707                return XFS_ERROR(EROFS);
 708
 709        if (XFS_FORCED_SHUTDOWN(mp))
 710                return XFS_ERROR(EIO);
 711
 712        error = -inode_change_ok(inode, iattr);
 713        if (error)
 714                return XFS_ERROR(error);
 715
 716        ASSERT(S_ISREG(ip->i_d.di_mode));
 717        ASSERT((mask & (ATTR_MODE|ATTR_UID|ATTR_GID|ATTR_ATIME|ATTR_ATIME_SET|
 718                        ATTR_MTIME_SET|ATTR_KILL_SUID|ATTR_KILL_SGID|
 719                        ATTR_KILL_PRIV|ATTR_TIMES_SET)) == 0);
 720
 721        if (!(flags & XFS_ATTR_NOLOCK)) {
 722                lock_flags |= XFS_IOLOCK_EXCL;
 723                xfs_ilock(ip, lock_flags);
 724        }
 725
 726        oldsize = inode->i_size;
 727        newsize = iattr->ia_size;
 728
 729        /*
 730         * Short circuit the truncate case for zero length files.
 731         */
 732        if (newsize == 0 && oldsize == 0 && ip->i_d.di_nextents == 0) {
 733                if (!(mask & (ATTR_CTIME|ATTR_MTIME)))
 734                        goto out_unlock;
 735
 736                /*
 737                 * Use the regular setattr path to update the timestamps.
 738                 */
 739                xfs_iunlock(ip, lock_flags);
 740                iattr->ia_valid &= ~ATTR_SIZE;
 741                return xfs_setattr_nonsize(ip, iattr, 0);
 742        }
 743
 744        /*
 745         * Make sure that the dquots are attached to the inode.
 746         */
 747        error = xfs_qm_dqattach(ip, 0);
 748        if (error)
 749                goto out_unlock;
 750
 751        /*
 752         * Now we can make the changes.  Before we join the inode to the
 753         * transaction, take care of the part of the truncation that must be
 754         * done without the inode lock.  This needs to be done before joining
 755         * the inode to the transaction, because the inode cannot be unlocked
 756         * once it is a part of the transaction.
 757         */
 758        if (newsize > oldsize) {
 759                /*
 760                 * Do the first part of growing a file: zero any data in the
 761                 * last block that is beyond the old EOF.  We need to do this
 762                 * before the inode is joined to the transaction to modify
 763                 * i_size.
 764                 */
 765                error = xfs_zero_eof(ip, newsize, oldsize);
 766                if (error)
 767                        goto out_unlock;
 768        }
 769
 770        /*
 771         * We are going to log the inode size change in this transaction so
 772         * any previous writes that are beyond the on disk EOF and the new
 773         * EOF that have not been written out need to be written here.  If we
 774         * do not write the data out, we expose ourselves to the null files
 775         * problem.
 776         *
 777         * Only flush from the on disk size to the smaller of the in memory
 778         * file size or the new size as that's the range we really care about
 779         * here and prevents waiting for other data not within the range we
 780         * care about here.
 781         */
 782        if (oldsize != ip->i_d.di_size && newsize > ip->i_d.di_size) {
 783                error = -filemap_write_and_wait_range(VFS_I(ip)->i_mapping,
 784                                                      ip->i_d.di_size, newsize);
 785                if (error)
 786                        goto out_unlock;
 787        }
 788
 789        /*
 790         * Wait for all direct I/O to complete.
 791         */
 792        inode_dio_wait(inode);
 793
 794        error = -block_truncate_page(inode->i_mapping, newsize, xfs_get_blocks);
 795        if (error)
 796                goto out_unlock;
 797
 798        tp = xfs_trans_alloc(mp, XFS_TRANS_SETATTR_SIZE);
 799        error = xfs_trans_reserve(tp, 0, XFS_ITRUNCATE_LOG_RES(mp), 0,
 800                                 XFS_TRANS_PERM_LOG_RES,
 801                                 XFS_ITRUNCATE_LOG_COUNT);
 802        if (error)
 803                goto out_trans_cancel;
 804
 805        truncate_setsize(inode, newsize);
 806
 807        commit_flags = XFS_TRANS_RELEASE_LOG_RES;
 808        lock_flags |= XFS_ILOCK_EXCL;
 809
 810        xfs_ilock(ip, XFS_ILOCK_EXCL);
 811
 812        xfs_trans_ijoin(tp, ip, 0);
 813
 814        /*
 815         * Only change the c/mtime if we are changing the size or we are
 816         * explicitly asked to change it.  This handles the semantic difference
 817         * between truncate() and ftruncate() as implemented in the VFS.
 818         *
 819         * The regular truncate() case without ATTR_CTIME and ATTR_MTIME is a
 820         * special case where we need to update the times despite not having
 821         * these flags set.  For all other operations the VFS set these flags
 822         * explicitly if it wants a timestamp update.
 823         */
 824        if (newsize != oldsize && (!(mask & (ATTR_CTIME | ATTR_MTIME)))) {
 825                iattr->ia_ctime = iattr->ia_mtime =
 826                        current_fs_time(inode->i_sb);
 827                mask |= ATTR_CTIME | ATTR_MTIME;
 828        }
 829
 830        /*
 831         * The first thing we do is set the size to new_size permanently on
 832         * disk.  This way we don't have to worry about anyone ever being able
 833         * to look at the data being freed even in the face of a crash.
 834         * What we're getting around here is the case where we free a block, it
 835         * is allocated to another file, it is written to, and then we crash.
 836         * If the new data gets written to the file but the log buffers
 837         * containing the free and reallocation don't, then we'd end up with
 838         * garbage in the blocks being freed.  As long as we make the new size
 839         * permanent before actually freeing any blocks it doesn't matter if
 840         * they get written to.
 841         */
 842        ip->i_d.di_size = newsize;
 843        xfs_trans_log_inode(tp, ip, XFS_ILOG_CORE);
 844
 845        if (newsize <= oldsize) {
 846                error = xfs_itruncate_extents(&tp, ip, XFS_DATA_FORK, newsize);
 847                if (error)
 848                        goto out_trans_abort;
 849
 850                /*
 851                 * Truncated "down", so we're removing references to old data
 852                 * here - if we delay flushing for a long time, we expose
 853                 * ourselves unduly to the notorious NULL files problem.  So,
 854                 * we mark this inode and flush it when the file is closed,
 855                 * and do not wait the usual (long) time for writeout.
 856                 */
 857                xfs_iflags_set(ip, XFS_ITRUNCATED);
 858
 859                /* A truncate down always removes post-EOF blocks. */
 860                xfs_inode_clear_eofblocks_tag(ip);
 861        }
 862
 863        if (mask & ATTR_CTIME) {
 864                inode->i_ctime = iattr->ia_ctime;
 865                ip->i_d.di_ctime.t_sec = iattr->ia_ctime.tv_sec;
 866                ip->i_d.di_ctime.t_nsec = iattr->ia_ctime.tv_nsec;
 867        }
 868        if (mask & ATTR_MTIME) {
 869                inode->i_mtime = iattr->ia_mtime;
 870                ip->i_d.di_mtime.t_sec = iattr->ia_mtime.tv_sec;
 871                ip->i_d.di_mtime.t_nsec = iattr->ia_mtime.tv_nsec;
 872        }
 873
 874        xfs_trans_log_inode(tp, ip, XFS_ILOG_CORE);
 875
 876        XFS_STATS_INC(xs_ig_attrchg);
 877
 878        if (mp->m_flags & XFS_MOUNT_WSYNC)
 879                xfs_trans_set_sync(tp);
 880
 881        error = xfs_trans_commit(tp, XFS_TRANS_RELEASE_LOG_RES);
 882out_unlock:
 883        if (lock_flags)
 884                xfs_iunlock(ip, lock_flags);
 885        return error;
 886
 887out_trans_abort:
 888        commit_flags |= XFS_TRANS_ABORT;
 889out_trans_cancel:
 890        xfs_trans_cancel(tp, commit_flags);
 891        goto out_unlock;
 892}
 893
 894STATIC int
 895xfs_vn_setattr(
 896        struct dentry   *dentry,
 897        struct iattr    *iattr)
 898{
 899        if (iattr->ia_valid & ATTR_SIZE)
 900                return -xfs_setattr_size(XFS_I(dentry->d_inode), iattr, 0);
 901        return -xfs_setattr_nonsize(XFS_I(dentry->d_inode), iattr, 0);
 902}
 903
 904STATIC int
 905xfs_vn_update_time(
 906        struct inode            *inode,
 907        struct timespec         *now,
 908        int                     flags)
 909{
 910        struct xfs_inode        *ip = XFS_I(inode);
 911        struct xfs_mount        *mp = ip->i_mount;
 912        struct xfs_trans        *tp;
 913        int                     error;
 914
 915        trace_xfs_update_time(ip);
 916
 917        tp = xfs_trans_alloc(mp, XFS_TRANS_FSYNC_TS);
 918        error = xfs_trans_reserve(tp, 0, XFS_FSYNC_TS_LOG_RES(mp), 0, 0, 0);
 919        if (error) {
 920                xfs_trans_cancel(tp, 0);
 921                return -error;
 922        }
 923
 924        xfs_ilock(ip, XFS_ILOCK_EXCL);
 925        if (flags & S_CTIME) {
 926                inode->i_ctime = *now;
 927                ip->i_d.di_ctime.t_sec = (__int32_t)now->tv_sec;
 928                ip->i_d.di_ctime.t_nsec = (__int32_t)now->tv_nsec;
 929        }
 930        if (flags & S_MTIME) {
 931                inode->i_mtime = *now;
 932                ip->i_d.di_mtime.t_sec = (__int32_t)now->tv_sec;
 933                ip->i_d.di_mtime.t_nsec = (__int32_t)now->tv_nsec;
 934        }
 935        if (flags & S_ATIME) {
 936                inode->i_atime = *now;
 937                ip->i_d.di_atime.t_sec = (__int32_t)now->tv_sec;
 938                ip->i_d.di_atime.t_nsec = (__int32_t)now->tv_nsec;
 939        }
 940        xfs_trans_ijoin(tp, ip, XFS_ILOCK_EXCL);
 941        xfs_trans_log_inode(tp, ip, XFS_ILOG_TIMESTAMP);
 942        return -xfs_trans_commit(tp, 0);
 943}
 944
 945#define XFS_FIEMAP_FLAGS        (FIEMAP_FLAG_SYNC|FIEMAP_FLAG_XATTR)
 946
 947/*
 948 * Call fiemap helper to fill in user data.
 949 * Returns positive errors to xfs_getbmap.
 950 */
 951STATIC int
 952xfs_fiemap_format(
 953        void                    **arg,
 954        struct getbmapx         *bmv,
 955        int                     *full)
 956{
 957        int                     error;
 958        struct fiemap_extent_info *fieinfo = *arg;
 959        u32                     fiemap_flags = 0;
 960        u64                     logical, physical, length;
 961
 962        /* Do nothing for a hole */
 963        if (bmv->bmv_block == -1LL)
 964                return 0;
 965
 966        logical = BBTOB(bmv->bmv_offset);
 967        physical = BBTOB(bmv->bmv_block);
 968        length = BBTOB(bmv->bmv_length);
 969
 970        if (bmv->bmv_oflags & BMV_OF_PREALLOC)
 971                fiemap_flags |= FIEMAP_EXTENT_UNWRITTEN;
 972        else if (bmv->bmv_oflags & BMV_OF_DELALLOC) {
 973                fiemap_flags |= FIEMAP_EXTENT_DELALLOC;
 974                physical = 0;   /* no block yet */
 975        }
 976        if (bmv->bmv_oflags & BMV_OF_LAST)
 977                fiemap_flags |= FIEMAP_EXTENT_LAST;
 978
 979        error = fiemap_fill_next_extent(fieinfo, logical, physical,
 980                                        length, fiemap_flags);
 981        if (error > 0) {
 982                error = 0;
 983                *full = 1;      /* user array now full */
 984        }
 985
 986        return -error;
 987}
 988
 989STATIC int
 990xfs_vn_fiemap(
 991        struct inode            *inode,
 992        struct fiemap_extent_info *fieinfo,
 993        u64                     start,
 994        u64                     length)
 995{
 996        xfs_inode_t             *ip = XFS_I(inode);
 997        struct getbmapx         bm;
 998        int                     error;
 999
1000        error = fiemap_check_flags(fieinfo, XFS_FIEMAP_FLAGS);
1001        if (error)
1002                return error;
1003
1004        /* Set up bmap header for xfs internal routine */
1005        bm.bmv_offset = BTOBB(start);
1006        /* Special case for whole file */
1007        if (length == FIEMAP_MAX_OFFSET)
1008                bm.bmv_length = -1LL;
1009        else
1010                bm.bmv_length = BTOBB(length);
1011
1012        /* We add one because in getbmap world count includes the header */
1013        bm.bmv_count = !fieinfo->fi_extents_max ? MAXEXTNUM :
1014                                        fieinfo->fi_extents_max + 1;
1015        bm.bmv_count = min_t(__s32, bm.bmv_count,
1016                             (PAGE_SIZE * 16 / sizeof(struct getbmapx)));
1017        bm.bmv_iflags = BMV_IF_PREALLOC | BMV_IF_NO_HOLES;
1018        if (fieinfo->fi_flags & FIEMAP_FLAG_XATTR)
1019                bm.bmv_iflags |= BMV_IF_ATTRFORK;
1020        if (!(fieinfo->fi_flags & FIEMAP_FLAG_SYNC))
1021                bm.bmv_iflags |= BMV_IF_DELALLOC;
1022
1023        error = xfs_getbmap(ip, &bm, xfs_fiemap_format, fieinfo);
1024        if (error)
1025                return -error;
1026
1027        return 0;
1028}
1029
1030static const struct inode_operations xfs_inode_operations = {
1031        .get_acl                = xfs_get_acl,
1032        .getattr                = xfs_vn_getattr,
1033        .setattr                = xfs_vn_setattr,
1034        .setxattr               = generic_setxattr,
1035        .getxattr               = generic_getxattr,
1036        .removexattr            = generic_removexattr,
1037        .listxattr              = xfs_vn_listxattr,
1038        .fiemap                 = xfs_vn_fiemap,
1039        .update_time            = xfs_vn_update_time,
1040};
1041
1042static const struct inode_operations xfs_dir_inode_operations = {
1043        .create                 = xfs_vn_create,
1044        .lookup                 = xfs_vn_lookup,
1045        .link                   = xfs_vn_link,
1046        .unlink                 = xfs_vn_unlink,
1047        .symlink                = xfs_vn_symlink,
1048        .mkdir                  = xfs_vn_mkdir,
1049        /*
1050         * Yes, XFS uses the same method for rmdir and unlink.
1051         *
1052         * There are some subtile differences deeper in the code,
1053         * but we use S_ISDIR to check for those.
1054         */
1055        .rmdir                  = xfs_vn_unlink,
1056        .mknod                  = xfs_vn_mknod,
1057        .rename                 = xfs_vn_rename,
1058        .get_acl                = xfs_get_acl,
1059        .getattr                = xfs_vn_getattr,
1060        .setattr                = xfs_vn_setattr,
1061        .setxattr               = generic_setxattr,
1062        .getxattr               = generic_getxattr,
1063        .removexattr            = generic_removexattr,
1064        .listxattr              = xfs_vn_listxattr,
1065        .update_time            = xfs_vn_update_time,
1066};
1067
1068static const struct inode_operations xfs_dir_ci_inode_operations = {
1069        .create                 = xfs_vn_create,
1070        .lookup                 = xfs_vn_ci_lookup,
1071        .link                   = xfs_vn_link,
1072        .unlink                 = xfs_vn_unlink,
1073        .symlink                = xfs_vn_symlink,
1074        .mkdir                  = xfs_vn_mkdir,
1075        /*
1076         * Yes, XFS uses the same method for rmdir and unlink.
1077         *
1078         * There are some subtile differences deeper in the code,
1079         * but we use S_ISDIR to check for those.
1080         */
1081        .rmdir                  = xfs_vn_unlink,
1082        .mknod                  = xfs_vn_mknod,
1083        .rename                 = xfs_vn_rename,
1084        .get_acl                = xfs_get_acl,
1085        .getattr                = xfs_vn_getattr,
1086        .setattr                = xfs_vn_setattr,
1087        .setxattr               = generic_setxattr,
1088        .getxattr               = generic_getxattr,
1089        .removexattr            = generic_removexattr,
1090        .listxattr              = xfs_vn_listxattr,
1091        .update_time            = xfs_vn_update_time,
1092};
1093
1094static const struct inode_operations xfs_symlink_inode_operations = {
1095        .readlink               = generic_readlink,
1096        .follow_link            = xfs_vn_follow_link,
1097        .put_link               = xfs_vn_put_link,
1098        .get_acl                = xfs_get_acl,
1099        .getattr                = xfs_vn_getattr,
1100        .setattr                = xfs_vn_setattr,
1101        .setxattr               = generic_setxattr,
1102        .getxattr               = generic_getxattr,
1103        .removexattr            = generic_removexattr,
1104        .listxattr              = xfs_vn_listxattr,
1105        .update_time            = xfs_vn_update_time,
1106};
1107
1108STATIC void
1109xfs_diflags_to_iflags(
1110        struct inode            *inode,
1111        struct xfs_inode        *ip)
1112{
1113        if (ip->i_d.di_flags & XFS_DIFLAG_IMMUTABLE)
1114                inode->i_flags |= S_IMMUTABLE;
1115        else
1116                inode->i_flags &= ~S_IMMUTABLE;
1117        if (ip->i_d.di_flags & XFS_DIFLAG_APPEND)
1118                inode->i_flags |= S_APPEND;
1119        else
1120                inode->i_flags &= ~S_APPEND;
1121        if (ip->i_d.di_flags & XFS_DIFLAG_SYNC)
1122                inode->i_flags |= S_SYNC;
1123        else
1124                inode->i_flags &= ~S_SYNC;
1125        if (ip->i_d.di_flags & XFS_DIFLAG_NOATIME)
1126                inode->i_flags |= S_NOATIME;
1127        else
1128                inode->i_flags &= ~S_NOATIME;
1129}
1130
1131/*
1132 * Initialize the Linux inode, set up the operation vectors and
1133 * unlock the inode.
1134 *
1135 * When reading existing inodes from disk this is called directly
1136 * from xfs_iget, when creating a new inode it is called from
1137 * xfs_ialloc after setting up the inode.
1138 *
1139 * We are always called with an uninitialised linux inode here.
1140 * We need to initialise the necessary fields and take a reference
1141 * on it.
1142 */
1143void
1144xfs_setup_inode(
1145        struct xfs_inode        *ip)
1146{
1147        struct inode            *inode = &ip->i_vnode;
1148
1149        inode->i_ino = ip->i_ino;
1150        inode->i_state = I_NEW;
1151
1152        inode_sb_list_add(inode);
1153        /* make the inode look hashed for the writeback code */
1154        hlist_add_fake(&inode->i_hash);
1155
1156        inode->i_mode   = ip->i_d.di_mode;
1157        set_nlink(inode, ip->i_d.di_nlink);
1158        inode->i_uid    = ip->i_d.di_uid;
1159        inode->i_gid    = ip->i_d.di_gid;
1160
1161        switch (inode->i_mode & S_IFMT) {
1162        case S_IFBLK:
1163        case S_IFCHR:
1164                inode->i_rdev =
1165                        MKDEV(sysv_major(ip->i_df.if_u2.if_rdev) & 0x1ff,
1166                              sysv_minor(ip->i_df.if_u2.if_rdev));
1167                break;
1168        default:
1169                inode->i_rdev = 0;
1170                break;
1171        }
1172
1173        inode->i_generation = ip->i_d.di_gen;
1174        i_size_write(inode, ip->i_d.di_size);
1175        inode->i_atime.tv_sec   = ip->i_d.di_atime.t_sec;
1176        inode->i_atime.tv_nsec  = ip->i_d.di_atime.t_nsec;
1177        inode->i_mtime.tv_sec   = ip->i_d.di_mtime.t_sec;
1178        inode->i_mtime.tv_nsec  = ip->i_d.di_mtime.t_nsec;
1179        inode->i_ctime.tv_sec   = ip->i_d.di_ctime.t_sec;
1180        inode->i_ctime.tv_nsec  = ip->i_d.di_ctime.t_nsec;
1181        xfs_diflags_to_iflags(inode, ip);
1182
1183        switch (inode->i_mode & S_IFMT) {
1184        case S_IFREG:
1185                inode->i_op = &xfs_inode_operations;
1186                inode->i_fop = &xfs_file_operations;
1187                inode->i_mapping->a_ops = &xfs_address_space_operations;
1188                break;
1189        case S_IFDIR:
1190                if (xfs_sb_version_hasasciici(&XFS_M(inode->i_sb)->m_sb))
1191                        inode->i_op = &xfs_dir_ci_inode_operations;
1192                else
1193                        inode->i_op = &xfs_dir_inode_operations;
1194                inode->i_fop = &xfs_dir_file_operations;
1195                break;
1196        case S_IFLNK:
1197                inode->i_op = &xfs_symlink_inode_operations;
1198                if (!(ip->i_df.if_flags & XFS_IFINLINE))
1199                        inode->i_mapping->a_ops = &xfs_address_space_operations;
1200                break;
1201        default:
1202                inode->i_op = &xfs_inode_operations;
1203                init_special_inode(inode, inode->i_mode, inode->i_rdev);
1204                break;
1205        }
1206
1207        /*
1208         * If there is no attribute fork no ACL can exist on this inode,
1209         * and it can't have any file capabilities attached to it either.
1210         */
1211        if (!XFS_IFORK_Q(ip)) {
1212                inode_has_no_xattr(inode);
1213                cache_no_acl(inode);
1214        }
1215
1216        xfs_iflags_clear(ip, XFS_INEW);
1217        barrier();
1218
1219        unlock_new_inode(inode);
1220}
1221
lxr.linux.no kindly hosted by Redpill Linpro AS, provider of Linux consulting and operations services since 1995.