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
 458static void
 459xfs_setattr_mode(
 460        struct xfs_trans        *tp,
 461        struct xfs_inode        *ip,
 462        struct iattr            *iattr)
 463{
 464        struct inode    *inode = VFS_I(ip);
 465        umode_t         mode = iattr->ia_mode;
 466
 467        ASSERT(tp);
 468        ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL));
 469
 470        ip->i_d.di_mode &= S_IFMT;
 471        ip->i_d.di_mode |= mode & ~S_IFMT;
 472
 473        inode->i_mode &= S_IFMT;
 474        inode->i_mode |= mode & ~S_IFMT;
 475}
 476
 477int
 478xfs_setattr_nonsize(
 479        struct xfs_inode        *ip,
 480        struct iattr            *iattr,
 481        int                     flags)
 482{
 483        xfs_mount_t             *mp = ip->i_mount;
 484        struct inode            *inode = VFS_I(ip);
 485        int                     mask = iattr->ia_valid;
 486        xfs_trans_t             *tp;
 487        int                     error;
 488        uid_t                   uid = 0, iuid = 0;
 489        gid_t                   gid = 0, igid = 0;
 490        struct xfs_dquot        *udqp = NULL, *gdqp = NULL;
 491        struct xfs_dquot        *olddquot1 = NULL, *olddquot2 = NULL;
 492
 493        trace_xfs_setattr(ip);
 494
 495        /* If acls are being inherited, we already have this checked */
 496        if (!(flags & XFS_ATTR_NOACL)) {
 497                if (mp->m_flags & XFS_MOUNT_RDONLY)
 498                        return XFS_ERROR(EROFS);
 499
 500                if (XFS_FORCED_SHUTDOWN(mp))
 501                        return XFS_ERROR(EIO);
 502
 503                error = -inode_change_ok(inode, iattr);
 504                if (error)
 505                        return XFS_ERROR(error);
 506        }
 507
 508        ASSERT((mask & ATTR_SIZE) == 0);
 509
 510        /*
 511         * If disk quotas is on, we make sure that the dquots do exist on disk,
 512         * before we start any other transactions. Trying to do this later
 513         * is messy. We don't care to take a readlock to look at the ids
 514         * in inode here, because we can't hold it across the trans_reserve.
 515         * If the IDs do change before we take the ilock, we're covered
 516         * because the i_*dquot fields will get updated anyway.
 517         */
 518        if (XFS_IS_QUOTA_ON(mp) && (mask & (ATTR_UID|ATTR_GID))) {
 519                uint    qflags = 0;
 520
 521                if ((mask & ATTR_UID) && XFS_IS_UQUOTA_ON(mp)) {
 522                        uid = iattr->ia_uid;
 523                        qflags |= XFS_QMOPT_UQUOTA;
 524                } else {
 525                        uid = ip->i_d.di_uid;
 526                }
 527                if ((mask & ATTR_GID) && XFS_IS_GQUOTA_ON(mp)) {
 528                        gid = iattr->ia_gid;
 529                        qflags |= XFS_QMOPT_GQUOTA;
 530                }  else {
 531                        gid = ip->i_d.di_gid;
 532                }
 533
 534                /*
 535                 * We take a reference when we initialize udqp and gdqp,
 536                 * so it is important that we never blindly double trip on
 537                 * the same variable. See xfs_create() for an example.
 538                 */
 539                ASSERT(udqp == NULL);
 540                ASSERT(gdqp == NULL);
 541                error = xfs_qm_vop_dqalloc(ip, uid, gid, xfs_get_projid(ip),
 542                                         qflags, &udqp, &gdqp, NULL);
 543                if (error)
 544                        return error;
 545        }
 546
 547        tp = xfs_trans_alloc(mp, XFS_TRANS_SETATTR_NOT_SIZE);
 548        error = xfs_trans_reserve(tp, 0, XFS_ICHANGE_LOG_RES(mp), 0, 0, 0);
 549        if (error)
 550                goto out_dqrele;
 551
 552        xfs_ilock(ip, XFS_ILOCK_EXCL);
 553
 554        /*
 555         * Change file ownership.  Must be the owner or privileged.
 556         */
 557        if (mask & (ATTR_UID|ATTR_GID)) {
 558                /*
 559                 * These IDs could have changed since we last looked at them.
 560                 * But, we're assured that if the ownership did change
 561                 * while we didn't have the inode locked, inode's dquot(s)
 562                 * would have changed also.
 563                 */
 564                iuid = ip->i_d.di_uid;
 565                igid = ip->i_d.di_gid;
 566                gid = (mask & ATTR_GID) ? iattr->ia_gid : igid;
 567                uid = (mask & ATTR_UID) ? iattr->ia_uid : iuid;
 568
 569                /*
 570                 * Do a quota reservation only if uid/gid is actually
 571                 * going to change.
 572                 */
 573                if (XFS_IS_QUOTA_RUNNING(mp) &&
 574                    ((XFS_IS_UQUOTA_ON(mp) && iuid != uid) ||
 575                     (XFS_IS_GQUOTA_ON(mp) && igid != gid))) {
 576                        ASSERT(tp);
 577                        error = xfs_qm_vop_chown_reserve(tp, ip, udqp, gdqp,
 578                                                NULL, capable(CAP_FOWNER) ?
 579                                                XFS_QMOPT_FORCE_RES : 0);
 580                        if (error)      /* out of quota */
 581                                goto out_trans_cancel;
 582                }
 583        }
 584
 585        xfs_trans_ijoin(tp, ip, 0);
 586
 587        /*
 588         * Change file ownership.  Must be the owner or privileged.
 589         */
 590        if (mask & (ATTR_UID|ATTR_GID)) {
 591                /*
 592                 * CAP_FSETID overrides the following restrictions:
 593                 *
 594                 * The set-user-ID and set-group-ID bits of a file will be
 595                 * cleared upon successful return from chown()
 596                 */
 597                if ((ip->i_d.di_mode & (S_ISUID|S_ISGID)) &&
 598                    !capable(CAP_FSETID))
 599                        ip->i_d.di_mode &= ~(S_ISUID|S_ISGID);
 600
 601                /*
 602                 * Change the ownerships and register quota modifications
 603                 * in the transaction.
 604                 */
 605                if (iuid != uid) {
 606                        if (XFS_IS_QUOTA_RUNNING(mp) && XFS_IS_UQUOTA_ON(mp)) {
 607                                ASSERT(mask & ATTR_UID);
 608                                ASSERT(udqp);
 609                                olddquot1 = xfs_qm_vop_chown(tp, ip,
 610                                                        &ip->i_udquot, udqp);
 611                        }
 612                        ip->i_d.di_uid = uid;
 613                        inode->i_uid = uid;
 614                }
 615                if (igid != gid) {
 616                        if (XFS_IS_QUOTA_RUNNING(mp) && XFS_IS_GQUOTA_ON(mp)) {
 617                                ASSERT(!XFS_IS_PQUOTA_ON(mp));
 618                                ASSERT(mask & ATTR_GID);
 619                                ASSERT(gdqp);
 620                                olddquot2 = xfs_qm_vop_chown(tp, ip,
 621                                                        &ip->i_gdquot, gdqp);
 622                        }
 623                        ip->i_d.di_gid = gid;
 624                        inode->i_gid = gid;
 625                }
 626        }
 627
 628        /*
 629         * Change file access modes.
 630         */
 631        if (mask & ATTR_MODE)
 632                xfs_setattr_mode(tp, ip, iattr);
 633
 634        /*
 635         * Change file access or modified times.
 636         */
 637        if (mask & ATTR_ATIME) {
 638                inode->i_atime = iattr->ia_atime;
 639                ip->i_d.di_atime.t_sec = iattr->ia_atime.tv_sec;
 640                ip->i_d.di_atime.t_nsec = iattr->ia_atime.tv_nsec;
 641        }
 642        if (mask & ATTR_CTIME) {
 643                inode->i_ctime = iattr->ia_ctime;
 644                ip->i_d.di_ctime.t_sec = iattr->ia_ctime.tv_sec;
 645                ip->i_d.di_ctime.t_nsec = iattr->ia_ctime.tv_nsec;
 646        }
 647        if (mask & ATTR_MTIME) {
 648                inode->i_mtime = iattr->ia_mtime;
 649                ip->i_d.di_mtime.t_sec = iattr->ia_mtime.tv_sec;
 650                ip->i_d.di_mtime.t_nsec = iattr->ia_mtime.tv_nsec;
 651        }
 652
 653        xfs_trans_log_inode(tp, ip, XFS_ILOG_CORE);
 654
 655        XFS_STATS_INC(xs_ig_attrchg);
 656
 657        if (mp->m_flags & XFS_MOUNT_WSYNC)
 658                xfs_trans_set_sync(tp);
 659        error = xfs_trans_commit(tp, 0);
 660
 661        xfs_iunlock(ip, XFS_ILOCK_EXCL);
 662
 663        /*
 664         * Release any dquot(s) the inode had kept before chown.
 665         */
 666        xfs_qm_dqrele(olddquot1);
 667        xfs_qm_dqrele(olddquot2);
 668        xfs_qm_dqrele(udqp);
 669        xfs_qm_dqrele(gdqp);
 670
 671        if (error)
 672                return XFS_ERROR(error);
 673
 674        /*
 675         * XXX(hch): Updating the ACL entries is not atomic vs the i_mode
 676         *           update.  We could avoid this with linked transactions
 677         *           and passing down the transaction pointer all the way
 678         *           to attr_set.  No previous user of the generic
 679         *           Posix ACL code seems to care about this issue either.
 680         */
 681        if ((mask & ATTR_MODE) && !(flags & XFS_ATTR_NOACL)) {
 682                error = -xfs_acl_chmod(inode);
 683                if (error)
 684                        return XFS_ERROR(error);
 685        }
 686
 687        return 0;
 688
 689out_trans_cancel:
 690        xfs_trans_cancel(tp, 0);
 691        xfs_iunlock(ip, XFS_ILOCK_EXCL);
 692out_dqrele:
 693        xfs_qm_dqrele(udqp);
 694        xfs_qm_dqrele(gdqp);
 695        return error;
 696}
 697
 698/*
 699 * Truncate file.  Must have write permission and not be a directory.
 700 */
 701int
 702xfs_setattr_size(
 703        struct xfs_inode        *ip,
 704        struct iattr            *iattr,
 705        int                     flags)
 706{
 707        struct xfs_mount        *mp = ip->i_mount;
 708        struct inode            *inode = VFS_I(ip);
 709        int                     mask = iattr->ia_valid;
 710        xfs_off_t               oldsize, newsize;
 711        struct xfs_trans        *tp;
 712        int                     error;
 713        uint                    lock_flags = 0;
 714        uint                    commit_flags = 0;
 715
 716        trace_xfs_setattr(ip);
 717
 718        if (mp->m_flags & XFS_MOUNT_RDONLY)
 719                return XFS_ERROR(EROFS);
 720
 721        if (XFS_FORCED_SHUTDOWN(mp))
 722                return XFS_ERROR(EIO);
 723
 724        error = -inode_change_ok(inode, iattr);
 725        if (error)
 726                return XFS_ERROR(error);
 727
 728        ASSERT(S_ISREG(ip->i_d.di_mode));
 729        ASSERT((mask & (ATTR_UID|ATTR_GID|ATTR_ATIME|ATTR_ATIME_SET|
 730                        ATTR_MTIME_SET|ATTR_KILL_PRIV|ATTR_TIMES_SET)) == 0);
 731
 732        if (!(flags & XFS_ATTR_NOLOCK)) {
 733                lock_flags |= XFS_IOLOCK_EXCL;
 734                xfs_ilock(ip, lock_flags);
 735        }
 736
 737        oldsize = inode->i_size;
 738        newsize = iattr->ia_size;
 739
 740        /*
 741         * Short circuit the truncate case for zero length files.
 742         */
 743        if (newsize == 0 && oldsize == 0 && ip->i_d.di_nextents == 0) {
 744                if (!(mask & (ATTR_CTIME|ATTR_MTIME)))
 745                        goto out_unlock;
 746
 747                /*
 748                 * Use the regular setattr path to update the timestamps.
 749                 */
 750                xfs_iunlock(ip, lock_flags);
 751                iattr->ia_valid &= ~ATTR_SIZE;
 752                return xfs_setattr_nonsize(ip, iattr, 0);
 753        }
 754
 755        /*
 756         * Make sure that the dquots are attached to the inode.
 757         */
 758        error = xfs_qm_dqattach(ip, 0);
 759        if (error)
 760                goto out_unlock;
 761
 762        /*
 763         * Now we can make the changes.  Before we join the inode to the
 764         * transaction, take care of the part of the truncation that must be
 765         * done without the inode lock.  This needs to be done before joining
 766         * the inode to the transaction, because the inode cannot be unlocked
 767         * once it is a part of the transaction.
 768         */
 769        if (newsize > oldsize) {
 770                /*
 771                 * Do the first part of growing a file: zero any data in the
 772                 * last block that is beyond the old EOF.  We need to do this
 773                 * before the inode is joined to the transaction to modify
 774                 * i_size.
 775                 */
 776                error = xfs_zero_eof(ip, newsize, oldsize);
 777                if (error)
 778                        goto out_unlock;
 779        }
 780
 781        /*
 782         * We are going to log the inode size change in this transaction so
 783         * any previous writes that are beyond the on disk EOF and the new
 784         * EOF that have not been written out need to be written here.  If we
 785         * do not write the data out, we expose ourselves to the null files
 786         * problem.
 787         *
 788         * Only flush from the on disk size to the smaller of the in memory
 789         * file size or the new size as that's the range we really care about
 790         * here and prevents waiting for other data not within the range we
 791         * care about here.
 792         */
 793        if (oldsize != ip->i_d.di_size && newsize > ip->i_d.di_size) {
 794                error = -filemap_write_and_wait_range(VFS_I(ip)->i_mapping,
 795                                                      ip->i_d.di_size, newsize);
 796                if (error)
 797                        goto out_unlock;
 798        }
 799
 800        /*
 801         * Wait for all direct I/O to complete.
 802         */
 803        inode_dio_wait(inode);
 804
 805        error = -block_truncate_page(inode->i_mapping, newsize, xfs_get_blocks);
 806        if (error)
 807                goto out_unlock;
 808
 809        tp = xfs_trans_alloc(mp, XFS_TRANS_SETATTR_SIZE);
 810        error = xfs_trans_reserve(tp, 0, XFS_ITRUNCATE_LOG_RES(mp), 0,
 811                                 XFS_TRANS_PERM_LOG_RES,
 812                                 XFS_ITRUNCATE_LOG_COUNT);
 813        if (error)
 814                goto out_trans_cancel;
 815
 816        truncate_setsize(inode, newsize);
 817
 818        commit_flags = XFS_TRANS_RELEASE_LOG_RES;
 819        lock_flags |= XFS_ILOCK_EXCL;
 820
 821        xfs_ilock(ip, XFS_ILOCK_EXCL);
 822
 823        xfs_trans_ijoin(tp, ip, 0);
 824
 825        /*
 826         * Only change the c/mtime if we are changing the size or we are
 827         * explicitly asked to change it.  This handles the semantic difference
 828         * between truncate() and ftruncate() as implemented in the VFS.
 829         *
 830         * The regular truncate() case without ATTR_CTIME and ATTR_MTIME is a
 831         * special case where we need to update the times despite not having
 832         * these flags set.  For all other operations the VFS set these flags
 833         * explicitly if it wants a timestamp update.
 834         */
 835        if (newsize != oldsize && (!(mask & (ATTR_CTIME | ATTR_MTIME)))) {
 836                iattr->ia_ctime = iattr->ia_mtime =
 837                        current_fs_time(inode->i_sb);
 838                mask |= ATTR_CTIME | ATTR_MTIME;
 839        }
 840
 841        /*
 842         * The first thing we do is set the size to new_size permanently on
 843         * disk.  This way we don't have to worry about anyone ever being able
 844         * to look at the data being freed even in the face of a crash.
 845         * What we're getting around here is the case where we free a block, it
 846         * is allocated to another file, it is written to, and then we crash.
 847         * If the new data gets written to the file but the log buffers
 848         * containing the free and reallocation don't, then we'd end up with
 849         * garbage in the blocks being freed.  As long as we make the new size
 850         * permanent before actually freeing any blocks it doesn't matter if
 851         * they get written to.
 852         */
 853        ip->i_d.di_size = newsize;
 854        xfs_trans_log_inode(tp, ip, XFS_ILOG_CORE);
 855
 856        if (newsize <= oldsize) {
 857                error = xfs_itruncate_extents(&tp, ip, XFS_DATA_FORK, newsize);
 858                if (error)
 859                        goto out_trans_abort;
 860
 861                /*
 862                 * Truncated "down", so we're removing references to old data
 863                 * here - if we delay flushing for a long time, we expose
 864                 * ourselves unduly to the notorious NULL files problem.  So,
 865                 * we mark this inode and flush it when the file is closed,
 866                 * and do not wait the usual (long) time for writeout.
 867                 */
 868                xfs_iflags_set(ip, XFS_ITRUNCATED);
 869
 870                /* A truncate down always removes post-EOF blocks. */
 871                xfs_inode_clear_eofblocks_tag(ip);
 872        }
 873
 874        /*
 875         * Change file access modes.
 876         */
 877        if (mask & ATTR_MODE)
 878                xfs_setattr_mode(tp, ip, iattr);
 879
 880        if (mask & ATTR_CTIME) {
 881                inode->i_ctime = iattr->ia_ctime;
 882                ip->i_d.di_ctime.t_sec = iattr->ia_ctime.tv_sec;
 883                ip->i_d.di_ctime.t_nsec = iattr->ia_ctime.tv_nsec;
 884        }
 885        if (mask & ATTR_MTIME) {
 886                inode->i_mtime = iattr->ia_mtime;
 887                ip->i_d.di_mtime.t_sec = iattr->ia_mtime.tv_sec;
 888                ip->i_d.di_mtime.t_nsec = iattr->ia_mtime.tv_nsec;
 889        }
 890
 891        xfs_trans_log_inode(tp, ip, XFS_ILOG_CORE);
 892
 893        XFS_STATS_INC(xs_ig_attrchg);
 894
 895        if (mp->m_flags & XFS_MOUNT_WSYNC)
 896                xfs_trans_set_sync(tp);
 897
 898        error = xfs_trans_commit(tp, XFS_TRANS_RELEASE_LOG_RES);
 899out_unlock:
 900        if (lock_flags)
 901                xfs_iunlock(ip, lock_flags);
 902        return error;
 903
 904out_trans_abort:
 905        commit_flags |= XFS_TRANS_ABORT;
 906out_trans_cancel:
 907        xfs_trans_cancel(tp, commit_flags);
 908        goto out_unlock;
 909}
 910
 911STATIC int
 912xfs_vn_setattr(
 913        struct dentry   *dentry,
 914        struct iattr    *iattr)
 915{
 916        if (iattr->ia_valid & ATTR_SIZE)
 917                return -xfs_setattr_size(XFS_I(dentry->d_inode), iattr, 0);
 918        return -xfs_setattr_nonsize(XFS_I(dentry->d_inode), iattr, 0);
 919}
 920
 921STATIC int
 922xfs_vn_update_time(
 923        struct inode            *inode,
 924        struct timespec         *now,
 925        int                     flags)
 926{
 927        struct xfs_inode        *ip = XFS_I(inode);
 928        struct xfs_mount        *mp = ip->i_mount;
 929        struct xfs_trans        *tp;
 930        int                     error;
 931
 932        trace_xfs_update_time(ip);
 933
 934        tp = xfs_trans_alloc(mp, XFS_TRANS_FSYNC_TS);
 935        error = xfs_trans_reserve(tp, 0, XFS_FSYNC_TS_LOG_RES(mp), 0, 0, 0);
 936        if (error) {
 937                xfs_trans_cancel(tp, 0);
 938                return -error;
 939        }
 940
 941        xfs_ilock(ip, XFS_ILOCK_EXCL);
 942        if (flags & S_CTIME) {
 943                inode->i_ctime = *now;
 944                ip->i_d.di_ctime.t_sec = (__int32_t)now->tv_sec;
 945                ip->i_d.di_ctime.t_nsec = (__int32_t)now->tv_nsec;
 946        }
 947        if (flags & S_MTIME) {
 948                inode->i_mtime = *now;
 949                ip->i_d.di_mtime.t_sec = (__int32_t)now->tv_sec;
 950                ip->i_d.di_mtime.t_nsec = (__int32_t)now->tv_nsec;
 951        }
 952        if (flags & S_ATIME) {
 953                inode->i_atime = *now;
 954                ip->i_d.di_atime.t_sec = (__int32_t)now->tv_sec;
 955                ip->i_d.di_atime.t_nsec = (__int32_t)now->tv_nsec;
 956        }
 957        xfs_trans_ijoin(tp, ip, XFS_ILOCK_EXCL);
 958        xfs_trans_log_inode(tp, ip, XFS_ILOG_TIMESTAMP);
 959        return -xfs_trans_commit(tp, 0);
 960}
 961
 962#define XFS_FIEMAP_FLAGS        (FIEMAP_FLAG_SYNC|FIEMAP_FLAG_XATTR)
 963
 964/*
 965 * Call fiemap helper to fill in user data.
 966 * Returns positive errors to xfs_getbmap.
 967 */
 968STATIC int
 969xfs_fiemap_format(
 970        void                    **arg,
 971        struct getbmapx         *bmv,
 972        int                     *full)
 973{
 974        int                     error;
 975        struct fiemap_extent_info *fieinfo = *arg;
 976        u32                     fiemap_flags = 0;
 977        u64                     logical, physical, length;
 978
 979        /* Do nothing for a hole */
 980        if (bmv->bmv_block == -1LL)
 981                return 0;
 982
 983        logical = BBTOB(bmv->bmv_offset);
 984        physical = BBTOB(bmv->bmv_block);
 985        length = BBTOB(bmv->bmv_length);
 986
 987        if (bmv->bmv_oflags & BMV_OF_PREALLOC)
 988                fiemap_flags |= FIEMAP_EXTENT_UNWRITTEN;
 989        else if (bmv->bmv_oflags & BMV_OF_DELALLOC) {
 990                fiemap_flags |= (FIEMAP_EXTENT_DELALLOC |
 991                                 FIEMAP_EXTENT_UNKNOWN);
 992                physical = 0;   /* no block yet */
 993        }
 994        if (bmv->bmv_oflags & BMV_OF_LAST)
 995                fiemap_flags |= FIEMAP_EXTENT_LAST;
 996
 997        error = fiemap_fill_next_extent(fieinfo, logical, physical,
 998                                        length, fiemap_flags);
 999        if (error > 0) {
1000                error = 0;
1001                *full = 1;      /* user array now full */
1002        }
1003
1004        return -error;
1005}
1006
1007STATIC int
1008xfs_vn_fiemap(
1009        struct inode            *inode,
1010        struct fiemap_extent_info *fieinfo,
1011        u64                     start,
1012        u64                     length)
1013{
1014        xfs_inode_t             *ip = XFS_I(inode);
1015        struct getbmapx         bm;
1016        int                     error;
1017
1018        error = fiemap_check_flags(fieinfo, XFS_FIEMAP_FLAGS);
1019        if (error)
1020                return error;
1021
1022        /* Set up bmap header for xfs internal routine */
1023        bm.bmv_offset = BTOBB(start);
1024        /* Special case for whole file */
1025        if (length == FIEMAP_MAX_OFFSET)
1026                bm.bmv_length = -1LL;
1027        else
1028                bm.bmv_length = BTOBB(length);
1029
1030        /* We add one because in getbmap world count includes the header */
1031        bm.bmv_count = !fieinfo->fi_extents_max ? MAXEXTNUM :
1032                                        fieinfo->fi_extents_max + 1;
1033        bm.bmv_count = min_t(__s32, bm.bmv_count,
1034                             (PAGE_SIZE * 16 / sizeof(struct getbmapx)));
1035        bm.bmv_iflags = BMV_IF_PREALLOC | BMV_IF_NO_HOLES;
1036        if (fieinfo->fi_flags & FIEMAP_FLAG_XATTR)
1037                bm.bmv_iflags |= BMV_IF_ATTRFORK;
1038        if (!(fieinfo->fi_flags & FIEMAP_FLAG_SYNC))
1039                bm.bmv_iflags |= BMV_IF_DELALLOC;
1040
1041        error = xfs_getbmap(ip, &bm, xfs_fiemap_format, fieinfo);
1042        if (error)
1043                return -error;
1044
1045        return 0;
1046}
1047
1048static const struct inode_operations xfs_inode_operations = {
1049        .get_acl                = xfs_get_acl,
1050        .getattr                = xfs_vn_getattr,
1051        .setattr                = xfs_vn_setattr,
1052        .setxattr               = generic_setxattr,
1053        .getxattr               = generic_getxattr,
1054        .removexattr            = generic_removexattr,
1055        .listxattr              = xfs_vn_listxattr,
1056        .fiemap                 = xfs_vn_fiemap,
1057        .update_time            = xfs_vn_update_time,
1058};
1059
1060static const struct inode_operations xfs_dir_inode_operations = {
1061        .create                 = xfs_vn_create,
1062        .lookup                 = xfs_vn_lookup,
1063        .link                   = xfs_vn_link,
1064        .unlink                 = xfs_vn_unlink,
1065        .symlink                = xfs_vn_symlink,
1066        .mkdir                  = xfs_vn_mkdir,
1067        /*
1068         * Yes, XFS uses the same method for rmdir and unlink.
1069         *
1070         * There are some subtile differences deeper in the code,
1071         * but we use S_ISDIR to check for those.
1072         */
1073        .rmdir                  = xfs_vn_unlink,
1074        .mknod                  = xfs_vn_mknod,
1075        .rename                 = xfs_vn_rename,
1076        .get_acl                = xfs_get_acl,
1077        .getattr                = xfs_vn_getattr,
1078        .setattr                = xfs_vn_setattr,
1079        .setxattr               = generic_setxattr,
1080        .getxattr               = generic_getxattr,
1081        .removexattr            = generic_removexattr,
1082        .listxattr              = xfs_vn_listxattr,
1083        .update_time            = xfs_vn_update_time,
1084};
1085
1086static const struct inode_operations xfs_dir_ci_inode_operations = {
1087        .create                 = xfs_vn_create,
1088        .lookup                 = xfs_vn_ci_lookup,
1089        .link                   = xfs_vn_link,
1090        .unlink                 = xfs_vn_unlink,
1091        .symlink                = xfs_vn_symlink,
1092        .mkdir                  = xfs_vn_mkdir,
1093        /*
1094         * Yes, XFS uses the same method for rmdir and unlink.
1095         *
1096         * There are some subtile differences deeper in the code,
1097         * but we use S_ISDIR to check for those.
1098         */
1099        .rmdir                  = xfs_vn_unlink,
1100        .mknod                  = xfs_vn_mknod,
1101        .rename                 = xfs_vn_rename,
1102        .get_acl                = xfs_get_acl,
1103        .getattr                = xfs_vn_getattr,
1104        .setattr                = xfs_vn_setattr,
1105        .setxattr               = generic_setxattr,
1106        .getxattr               = generic_getxattr,
1107        .removexattr            = generic_removexattr,
1108        .listxattr              = xfs_vn_listxattr,
1109        .update_time            = xfs_vn_update_time,
1110};
1111
1112static const struct inode_operations xfs_symlink_inode_operations = {
1113        .readlink               = generic_readlink,
1114        .follow_link            = xfs_vn_follow_link,
1115        .put_link               = xfs_vn_put_link,
1116        .get_acl                = xfs_get_acl,
1117        .getattr                = xfs_vn_getattr,
1118        .setattr                = xfs_vn_setattr,
1119        .setxattr               = generic_setxattr,
1120        .getxattr               = generic_getxattr,
1121        .removexattr            = generic_removexattr,
1122        .listxattr              = xfs_vn_listxattr,
1123        .update_time            = xfs_vn_update_time,
1124};
1125
1126STATIC void
1127xfs_diflags_to_iflags(
1128        struct inode            *inode,
1129        struct xfs_inode        *ip)
1130{
1131        if (ip->i_d.di_flags & XFS_DIFLAG_IMMUTABLE)
1132                inode->i_flags |= S_IMMUTABLE;
1133        else
1134                inode->i_flags &= ~S_IMMUTABLE;
1135        if (ip->i_d.di_flags & XFS_DIFLAG_APPEND)
1136                inode->i_flags |= S_APPEND;
1137        else
1138                inode->i_flags &= ~S_APPEND;
1139        if (ip->i_d.di_flags & XFS_DIFLAG_SYNC)
1140                inode->i_flags |= S_SYNC;
1141        else
1142                inode->i_flags &= ~S_SYNC;
1143        if (ip->i_d.di_flags & XFS_DIFLAG_NOATIME)
1144                inode->i_flags |= S_NOATIME;
1145        else
1146                inode->i_flags &= ~S_NOATIME;
1147}
1148
1149/*
1150 * Initialize the Linux inode, set up the operation vectors and
1151 * unlock the inode.
1152 *
1153 * When reading existing inodes from disk this is called directly
1154 * from xfs_iget, when creating a new inode it is called from
1155 * xfs_ialloc after setting up the inode.
1156 *
1157 * We are always called with an uninitialised linux inode here.
1158 * We need to initialise the necessary fields and take a reference
1159 * on it.
1160 */
1161void
1162xfs_setup_inode(
1163        struct xfs_inode        *ip)
1164{
1165        struct inode            *inode = &ip->i_vnode;
1166
1167        inode->i_ino = ip->i_ino;
1168        inode->i_state = I_NEW;
1169
1170        inode_sb_list_add(inode);
1171        /* make the inode look hashed for the writeback code */
1172        hlist_add_fake(&inode->i_hash);
1173
1174        inode->i_mode   = ip->i_d.di_mode;
1175        set_nlink(inode, ip->i_d.di_nlink);
1176        inode->i_uid    = ip->i_d.di_uid;
1177        inode->i_gid    = ip->i_d.di_gid;
1178
1179        switch (inode->i_mode & S_IFMT) {
1180        case S_IFBLK:
1181        case S_IFCHR:
1182                inode->i_rdev =
1183                        MKDEV(sysv_major(ip->i_df.if_u2.if_rdev) & 0x1ff,
1184                              sysv_minor(ip->i_df.if_u2.if_rdev));
1185                break;
1186        default:
1187                inode->i_rdev = 0;
1188                break;
1189        }
1190
1191        inode->i_generation = ip->i_d.di_gen;
1192        i_size_write(inode, ip->i_d.di_size);
1193        inode->i_atime.tv_sec   = ip->i_d.di_atime.t_sec;
1194        inode->i_atime.tv_nsec  = ip->i_d.di_atime.t_nsec;
1195        inode->i_mtime.tv_sec   = ip->i_d.di_mtime.t_sec;
1196        inode->i_mtime.tv_nsec  = ip->i_d.di_mtime.t_nsec;
1197        inode->i_ctime.tv_sec   = ip->i_d.di_ctime.t_sec;
1198        inode->i_ctime.tv_nsec  = ip->i_d.di_ctime.t_nsec;
1199        xfs_diflags_to_iflags(inode, ip);
1200
1201        switch (inode->i_mode & S_IFMT) {
1202        case S_IFREG:
1203                inode->i_op = &xfs_inode_operations;
1204                inode->i_fop = &xfs_file_operations;
1205                inode->i_mapping->a_ops = &xfs_address_space_operations;
1206                break;
1207        case S_IFDIR:
1208                if (xfs_sb_version_hasasciici(&XFS_M(inode->i_sb)->m_sb))
1209                        inode->i_op = &xfs_dir_ci_inode_operations;
1210                else
1211                        inode->i_op = &xfs_dir_inode_operations;
1212                inode->i_fop = &xfs_dir_file_operations;
1213                break;
1214        case S_IFLNK:
1215                inode->i_op = &xfs_symlink_inode_operations;
1216                if (!(ip->i_df.if_flags & XFS_IFINLINE))
1217                        inode->i_mapping->a_ops = &xfs_address_space_operations;
1218                break;
1219        default:
1220                inode->i_op = &xfs_inode_operations;
1221                init_special_inode(inode, inode->i_mode, inode->i_rdev);
1222                break;
1223        }
1224
1225        /*
1226         * If there is no attribute fork no ACL can exist on this inode,
1227         * and it can't have any file capabilities attached to it either.
1228         */
1229        if (!XFS_IFORK_Q(ip)) {
1230                inode_has_no_xattr(inode);
1231                cache_no_acl(inode);
1232        }
1233
1234        xfs_iflags_clear(ip, XFS_INEW);
1235        barrier();
1236
1237        unlock_new_inode(inode);
1238}
1239
lxr.linux.no kindly hosted by Redpill Linpro AS, provider of Linux consulting and operations services since 1995.