linux/fs/open.c
<<
>>
Prefs
   1/*
   2 *  linux/fs/open.c
   3 *
   4 *  Copyright (C) 1991, 1992  Linus Torvalds
   5 */
   6
   7#include <linux/string.h>
   8#include <linux/mm.h>
   9#include <linux/file.h>
  10#include <linux/quotaops.h>
  11#include <linux/fsnotify.h>
  12#include <linux/module.h>
  13#include <linux/slab.h>
  14#include <linux/tty.h>
  15#include <linux/namei.h>
  16#include <linux/backing-dev.h>
  17#include <linux/capability.h>
  18#include <linux/security.h>
  19#include <linux/mount.h>
  20#include <linux/vfs.h>
  21#include <linux/fcntl.h>
  22#include <asm/uaccess.h>
  23#include <linux/fs.h>
  24#include <linux/personality.h>
  25#include <linux/pagemap.h>
  26#include <linux/syscalls.h>
  27#include <linux/rcupdate.h>
  28#include <linux/audit.h>
  29#include <linux/falloc.h>
  30
  31int vfs_statfs(struct dentry *dentry, struct kstatfs *buf)
  32{
  33        int retval = -ENODEV;
  34
  35        if (dentry) {
  36                retval = -ENOSYS;
  37                if (dentry->d_sb->s_op->statfs) {
  38                        memset(buf, 0, sizeof(*buf));
  39                        retval = security_sb_statfs(dentry);
  40                        if (retval)
  41                                return retval;
  42                        retval = dentry->d_sb->s_op->statfs(dentry, buf);
  43                        if (retval == 0 && buf->f_frsize == 0)
  44                                buf->f_frsize = buf->f_bsize;
  45                }
  46        }
  47        return retval;
  48}
  49
  50EXPORT_SYMBOL(vfs_statfs);
  51
  52static int vfs_statfs_native(struct dentry *dentry, struct statfs *buf)
  53{
  54        struct kstatfs st;
  55        int retval;
  56
  57        retval = vfs_statfs(dentry, &st);
  58        if (retval)
  59                return retval;
  60
  61        if (sizeof(*buf) == sizeof(st))
  62                memcpy(buf, &st, sizeof(st));
  63        else {
  64                if (sizeof buf->f_blocks == 4) {
  65                        if ((st.f_blocks | st.f_bfree | st.f_bavail) &
  66                            0xffffffff00000000ULL)
  67                                return -EOVERFLOW;
  68                        /*
  69                         * f_files and f_ffree may be -1; it's okay to stuff
  70                         * that into 32 bits
  71                         */
  72                        if (st.f_files != -1 &&
  73                            (st.f_files & 0xffffffff00000000ULL))
  74                                return -EOVERFLOW;
  75                        if (st.f_ffree != -1 &&
  76                            (st.f_ffree & 0xffffffff00000000ULL))
  77                                return -EOVERFLOW;
  78                }
  79
  80                buf->f_type = st.f_type;
  81                buf->f_bsize = st.f_bsize;
  82                buf->f_blocks = st.f_blocks;
  83                buf->f_bfree = st.f_bfree;
  84                buf->f_bavail = st.f_bavail;
  85                buf->f_files = st.f_files;
  86                buf->f_ffree = st.f_ffree;
  87                buf->f_fsid = st.f_fsid;
  88                buf->f_namelen = st.f_namelen;
  89                buf->f_frsize = st.f_frsize;
  90                memset(buf->f_spare, 0, sizeof(buf->f_spare));
  91        }
  92        return 0;
  93}
  94
  95static int vfs_statfs64(struct dentry *dentry, struct statfs64 *buf)
  96{
  97        struct kstatfs st;
  98        int retval;
  99
 100        retval = vfs_statfs(dentry, &st);
 101        if (retval)
 102                return retval;
 103
 104        if (sizeof(*buf) == sizeof(st))
 105                memcpy(buf, &st, sizeof(st));
 106        else {
 107                buf->f_type = st.f_type;
 108                buf->f_bsize = st.f_bsize;
 109                buf->f_blocks = st.f_blocks;
 110                buf->f_bfree = st.f_bfree;
 111                buf->f_bavail = st.f_bavail;
 112                buf->f_files = st.f_files;
 113                buf->f_ffree = st.f_ffree;
 114                buf->f_fsid = st.f_fsid;
 115                buf->f_namelen = st.f_namelen;
 116                buf->f_frsize = st.f_frsize;
 117                memset(buf->f_spare, 0, sizeof(buf->f_spare));
 118        }
 119        return 0;
 120}
 121
 122asmlinkage long sys_statfs(const char __user * path, struct statfs __user * buf)
 123{
 124        struct nameidata nd;
 125        int error;
 126
 127        error = user_path_walk(path, &nd);
 128        if (!error) {
 129                struct statfs tmp;
 130                error = vfs_statfs_native(nd.path.dentry, &tmp);
 131                if (!error && copy_to_user(buf, &tmp, sizeof(tmp)))
 132                        error = -EFAULT;
 133                path_put(&nd.path);
 134        }
 135        return error;
 136}
 137
 138
 139asmlinkage long sys_statfs64(const char __user *path, size_t sz, struct statfs64 __user *buf)
 140{
 141        struct nameidata nd;
 142        long error;
 143
 144        if (sz != sizeof(*buf))
 145                return -EINVAL;
 146        error = user_path_walk(path, &nd);
 147        if (!error) {
 148                struct statfs64 tmp;
 149                error = vfs_statfs64(nd.path.dentry, &tmp);
 150                if (!error && copy_to_user(buf, &tmp, sizeof(tmp)))
 151                        error = -EFAULT;
 152                path_put(&nd.path);
 153        }
 154        return error;
 155}
 156
 157
 158asmlinkage long sys_fstatfs(unsigned int fd, struct statfs __user * buf)
 159{
 160        struct file * file;
 161        struct statfs tmp;
 162        int error;
 163
 164        error = -EBADF;
 165        file = fget(fd);
 166        if (!file)
 167                goto out;
 168        error = vfs_statfs_native(file->f_path.dentry, &tmp);
 169        if (!error && copy_to_user(buf, &tmp, sizeof(tmp)))
 170                error = -EFAULT;
 171        fput(file);
 172out:
 173        return error;
 174}
 175
 176asmlinkage long sys_fstatfs64(unsigned int fd, size_t sz, struct statfs64 __user *buf)
 177{
 178        struct file * file;
 179        struct statfs64 tmp;
 180        int error;
 181
 182        if (sz != sizeof(*buf))
 183                return -EINVAL;
 184
 185        error = -EBADF;
 186        file = fget(fd);
 187        if (!file)
 188                goto out;
 189        error = vfs_statfs64(file->f_path.dentry, &tmp);
 190        if (!error && copy_to_user(buf, &tmp, sizeof(tmp)))
 191                error = -EFAULT;
 192        fput(file);
 193out:
 194        return error;
 195}
 196
 197int do_truncate(struct dentry *dentry, loff_t length, unsigned int time_attrs,
 198        struct file *filp)
 199{
 200        int err;
 201        struct iattr newattrs;
 202
 203        /* Not pretty: "inode->i_size" shouldn't really be signed. But it is. */
 204        if (length < 0)
 205                return -EINVAL;
 206
 207        newattrs.ia_size = length;
 208        newattrs.ia_valid = ATTR_SIZE | time_attrs;
 209        if (filp) {
 210                newattrs.ia_file = filp;
 211                newattrs.ia_valid |= ATTR_FILE;
 212        }
 213
 214        /* Remove suid/sgid on truncate too */
 215        newattrs.ia_valid |= should_remove_suid(dentry);
 216
 217        mutex_lock(&dentry->d_inode->i_mutex);
 218        err = notify_change(dentry, &newattrs);
 219        mutex_unlock(&dentry->d_inode->i_mutex);
 220        return err;
 221}
 222
 223static long do_sys_truncate(const char __user * path, loff_t length)
 224{
 225        struct nameidata nd;
 226        struct inode * inode;
 227        int error;
 228
 229        error = -EINVAL;
 230        if (length < 0) /* sorry, but loff_t says... */
 231                goto out;
 232
 233        error = user_path_walk(path, &nd);
 234        if (error)
 235                goto out;
 236        inode = nd.path.dentry->d_inode;
 237
 238        /* For directories it's -EISDIR, for other non-regulars - -EINVAL */
 239        error = -EISDIR;
 240        if (S_ISDIR(inode->i_mode))
 241                goto dput_and_out;
 242
 243        error = -EINVAL;
 244        if (!S_ISREG(inode->i_mode))
 245                goto dput_and_out;
 246
 247        error = vfs_permission(&nd, MAY_WRITE);
 248        if (error)
 249                goto dput_and_out;
 250
 251        error = -EROFS;
 252        if (IS_RDONLY(inode))
 253                goto dput_and_out;
 254
 255        error = -EPERM;
 256        if (IS_IMMUTABLE(inode) || IS_APPEND(inode))
 257                goto dput_and_out;
 258
 259        error = get_write_access(inode);
 260        if (error)
 261                goto dput_and_out;
 262
 263        /*
 264         * Make sure that there are no leases.  get_write_access() protects
 265         * against the truncate racing with a lease-granting setlease().
 266         */
 267        error = break_lease(inode, FMODE_WRITE);
 268        if (error)
 269                goto put_write_and_out;
 270
 271        error = locks_verify_truncate(inode, NULL, length);
 272        if (!error) {
 273                DQUOT_INIT(inode);
 274                error = do_truncate(nd.path.dentry, length, 0, NULL);
 275        }
 276
 277put_write_and_out:
 278        put_write_access(inode);
 279dput_and_out:
 280        path_put(&nd.path);
 281out:
 282        return error;
 283}
 284
 285asmlinkage long sys_truncate(const char __user * path, unsigned long length)
 286{
 287        /* on 32-bit boxen it will cut the range 2^31--2^32-1 off */
 288        return do_sys_truncate(path, (long)length);
 289}
 290
 291static long do_sys_ftruncate(unsigned int fd, loff_t length, int small)
 292{
 293        struct inode * inode;
 294        struct dentry *dentry;
 295        struct file * file;
 296        int error;
 297
 298        error = -EINVAL;
 299        if (length < 0)
 300                goto out;
 301        error = -EBADF;
 302        file = fget(fd);
 303        if (!file)
 304                goto out;
 305
 306        /* explicitly opened as large or we are on 64-bit box */
 307        if (file->f_flags & O_LARGEFILE)
 308                small = 0;
 309
 310        dentry = file->f_path.dentry;
 311        inode = dentry->d_inode;
 312        error = -EINVAL;
 313        if (!S_ISREG(inode->i_mode) || !(file->f_mode & FMODE_WRITE))
 314                goto out_putf;
 315
 316        error = -EINVAL;
 317        /* Cannot ftruncate over 2^31 bytes without large file support */
 318        if (small && length > MAX_NON_LFS)
 319                goto out_putf;
 320
 321        error = -EPERM;
 322        if (IS_APPEND(inode))
 323                goto out_putf;
 324
 325        error = locks_verify_truncate(inode, file, length);
 326        if (!error)
 327                error = do_truncate(dentry, length, ATTR_MTIME|ATTR_CTIME, file);
 328out_putf:
 329        fput(file);
 330out:
 331        return error;
 332}
 333
 334asmlinkage long sys_ftruncate(unsigned int fd, unsigned long length)
 335{
 336        long ret = do_sys_ftruncate(fd, length, 1);
 337        /* avoid REGPARM breakage on x86: */
 338        asmlinkage_protect(2, ret, fd, length);
 339        return ret;
 340}
 341
 342/* LFS versions of truncate are only needed on 32 bit machines */
 343#if BITS_PER_LONG == 32
 344asmlinkage long sys_truncate64(const char __user * path, loff_t length)
 345{
 346        return do_sys_truncate(path, length);
 347}
 348
 349asmlinkage long sys_ftruncate64(unsigned int fd, loff_t length)
 350{
 351        long ret = do_sys_ftruncate(fd, length, 0);
 352        /* avoid REGPARM breakage on x86: */
 353        asmlinkage_protect(2, ret, fd, length);
 354        return ret;
 355}
 356#endif
 357
 358asmlinkage long sys_fallocate(int fd, int mode, loff_t offset, loff_t len)
 359{
 360        struct file *file;
 361        struct inode *inode;
 362        long ret = -EINVAL;
 363
 364        if (offset < 0 || len <= 0)
 365                goto out;
 366
 367        /* Return error if mode is not supported */
 368        ret = -EOPNOTSUPP;
 369        if (mode && !(mode & FALLOC_FL_KEEP_SIZE))
 370                goto out;
 371
 372        ret = -EBADF;
 373        file = fget(fd);
 374        if (!file)
 375                goto out;
 376        if (!(file->f_mode & FMODE_WRITE))
 377                goto out_fput;
 378        /*
 379         * Revalidate the write permissions, in case security policy has
 380         * changed since the files were opened.
 381         */
 382        ret = security_file_permission(file, MAY_WRITE);
 383        if (ret)
 384                goto out_fput;
 385
 386        inode = file->f_path.dentry->d_inode;
 387
 388        ret = -ESPIPE;
 389        if (S_ISFIFO(inode->i_mode))
 390                goto out_fput;
 391
 392        ret = -ENODEV;
 393        /*
 394         * Let individual file system decide if it supports preallocation
 395         * for directories or not.
 396         */
 397        if (!S_ISREG(inode->i_mode) && !S_ISDIR(inode->i_mode))
 398                goto out_fput;
 399
 400        ret = -EFBIG;
 401        /* Check for wrap through zero too */
 402        if (((offset + len) > inode->i_sb->s_maxbytes) || ((offset + len) < 0))
 403                goto out_fput;
 404
 405        if (inode->i_op && inode->i_op->fallocate)
 406                ret = inode->i_op->fallocate(inode, mode, offset, len);
 407        else
 408                ret = -EOPNOTSUPP;
 409
 410out_fput:
 411        fput(file);
 412out:
 413        return ret;
 414}
 415
 416/*
 417 * access() needs to use the real uid/gid, not the effective uid/gid.
 418 * We do this by temporarily clearing all FS-related capabilities and
 419 * switching the fsuid/fsgid around to the real ones.
 420 */
 421asmlinkage long sys_faccessat(int dfd, const char __user *filename, int mode)
 422{
 423        struct nameidata nd;
 424        int old_fsuid, old_fsgid;
 425        kernel_cap_t old_cap;
 426        int res;
 427
 428        if (mode & ~S_IRWXO)    /* where's F_OK, X_OK, W_OK, R_OK? */
 429                return -EINVAL;
 430
 431        old_fsuid = current->fsuid;
 432        old_fsgid = current->fsgid;
 433        old_cap = current->cap_effective;
 434
 435        current->fsuid = current->uid;
 436        current->fsgid = current->gid;
 437
 438        /*
 439         * Clear the capabilities if we switch to a non-root user
 440         *
 441         * FIXME: There is a race here against sys_capset.  The
 442         * capabilities can change yet we will restore the old
 443         * value below.  We should hold task_capabilities_lock,
 444         * but we cannot because user_path_walk can sleep.
 445         */
 446        if (current->uid)
 447                cap_clear(current->cap_effective);
 448        else
 449                current->cap_effective = current->cap_permitted;
 450
 451        res = __user_walk_fd(dfd, filename, LOOKUP_FOLLOW|LOOKUP_ACCESS, &nd);
 452        if (res)
 453                goto out;
 454
 455        res = vfs_permission(&nd, mode);
 456        /* SuS v2 requires we report a read only fs too */
 457        if(res || !(mode & S_IWOTH) ||
 458           special_file(nd.path.dentry->d_inode->i_mode))
 459                goto out_path_release;
 460
 461        if(IS_RDONLY(nd.path.dentry->d_inode))
 462                res = -EROFS;
 463
 464out_path_release:
 465        path_put(&nd.path);
 466out:
 467        current->fsuid = old_fsuid;
 468        current->fsgid = old_fsgid;
 469        current->cap_effective = old_cap;
 470
 471        return res;
 472}
 473
 474asmlinkage long sys_access(const char __user *filename, int mode)
 475{
 476        return sys_faccessat(AT_FDCWD, filename, mode);
 477}
 478
 479asmlinkage long sys_chdir(const char __user * filename)
 480{
 481        struct nameidata nd;
 482        int error;
 483
 484        error = __user_walk(filename,
 485                            LOOKUP_FOLLOW|LOOKUP_DIRECTORY|LOOKUP_CHDIR, &nd);
 486        if (error)
 487                goto out;
 488
 489        error = vfs_permission(&nd, MAY_EXEC);
 490        if (error)
 491                goto dput_and_out;
 492
 493        set_fs_pwd(current->fs, &nd.path);
 494
 495dput_and_out:
 496        path_put(&nd.path);
 497out:
 498        return error;
 499}
 500
 501asmlinkage long sys_fchdir(unsigned int fd)
 502{
 503        struct file *file;
 504        struct inode *inode;
 505        int error;
 506
 507        error = -EBADF;
 508        file = fget(fd);
 509        if (!file)
 510                goto out;
 511
 512        inode = file->f_path.dentry->d_inode;
 513
 514        error = -ENOTDIR;
 515        if (!S_ISDIR(inode->i_mode))
 516                goto out_putf;
 517
 518        error = file_permission(file, MAY_EXEC);
 519        if (!error)
 520                set_fs_pwd(current->fs, &file->f_path);
 521out_putf:
 522        fput(file);
 523out:
 524        return error;
 525}
 526
 527asmlinkage long sys_chroot(const char __user * filename)
 528{
 529        struct nameidata nd;
 530        int error;
 531
 532        error = __user_walk(filename, LOOKUP_FOLLOW | LOOKUP_DIRECTORY | LOOKUP_NOALT, &nd);
 533        if (error)
 534                goto out;
 535
 536        error = vfs_permission(&nd, MAY_EXEC);
 537        if (error)
 538                goto dput_and_out;
 539
 540        error = -EPERM;
 541        if (!capable(CAP_SYS_CHROOT))
 542                goto dput_and_out;
 543
 544        set_fs_root(current->fs, &nd.path);
 545        set_fs_altroot();
 546        error = 0;
 547dput_and_out:
 548        path_put(&nd.path);
 549out:
 550        return error;
 551}
 552
 553asmlinkage long sys_fchmod(unsigned int fd, mode_t mode)
 554{
 555        struct inode * inode;
 556        struct dentry * dentry;
 557        struct file * file;
 558        int err = -EBADF;
 559        struct iattr newattrs;
 560
 561        file = fget(fd);
 562        if (!file)
 563                goto out;
 564
 565        dentry = file->f_path.dentry;
 566        inode = dentry->d_inode;
 567
 568        audit_inode(NULL, dentry);
 569
 570        err = -EROFS;
 571        if (IS_RDONLY(inode))
 572                goto out_putf;
 573        err = -EPERM;
 574        if (IS_IMMUTABLE(inode) || IS_APPEND(inode))
 575                goto out_putf;
 576        mutex_lock(&inode->i_mutex);
 577        if (mode == (mode_t) -1)
 578                mode = inode->i_mode;
 579        newattrs.ia_mode = (mode & S_IALLUGO) | (inode->i_mode & ~S_IALLUGO);
 580        newattrs.ia_valid = ATTR_MODE | ATTR_CTIME;
 581        err = notify_change(dentry, &newattrs);
 582        mutex_unlock(&inode->i_mutex);
 583
 584out_putf:
 585        fput(file);
 586out:
 587        return err;
 588}
 589
 590asmlinkage long sys_fchmodat(int dfd, const char __user *filename,
 591                             mode_t mode)
 592{
 593        struct nameidata nd;
 594        struct inode * inode;
 595        int error;
 596        struct iattr newattrs;
 597
 598        error = __user_walk_fd(dfd, filename, LOOKUP_FOLLOW, &nd);
 599        if (error)
 600                goto out;
 601        inode = nd.path.dentry->d_inode;
 602
 603        error = -EROFS;
 604        if (IS_RDONLY(inode))
 605                goto dput_and_out;
 606
 607        error = -EPERM;
 608        if (IS_IMMUTABLE(inode) || IS_APPEND(inode))
 609                goto dput_and_out;
 610
 611        mutex_lock(&inode->i_mutex);
 612        if (mode == (mode_t) -1)
 613                mode = inode->i_mode;
 614        newattrs.ia_mode = (mode & S_IALLUGO) | (inode->i_mode & ~S_IALLUGO);
 615        newattrs.ia_valid = ATTR_MODE | ATTR_CTIME;
 616        error = notify_change(nd.path.dentry, &newattrs);
 617        mutex_unlock(&inode->i_mutex);
 618
 619dput_and_out:
 620        path_put(&nd.path);
 621out:
 622        return error;
 623}
 624
 625asmlinkage long sys_chmod(const char __user *filename, mode_t mode)
 626{
 627        return sys_fchmodat(AT_FDCWD, filename, mode);
 628}
 629
 630static int chown_common(struct dentry * dentry, uid_t user, gid_t group)
 631{
 632        struct inode * inode;
 633        int error;
 634        struct iattr newattrs;
 635
 636        error = -ENOENT;
 637        if (!(inode = dentry->d_inode)) {
 638                printk(KERN_ERR "chown_common: NULL inode\n");
 639                goto out;
 640        }
 641        error = -EROFS;
 642        if (IS_RDONLY(inode))
 643                goto out;
 644        error = -EPERM;
 645        if (IS_IMMUTABLE(inode) || IS_APPEND(inode))
 646                goto out;
 647        newattrs.ia_valid =  ATTR_CTIME;
 648        if (user != (uid_t) -1) {
 649                newattrs.ia_valid |= ATTR_UID;
 650                newattrs.ia_uid = user;
 651        }
 652        if (group != (gid_t) -1) {
 653                newattrs.ia_valid |= ATTR_GID;
 654                newattrs.ia_gid = group;
 655        }
 656        if (!S_ISDIR(inode->i_mode))
 657                newattrs.ia_valid |=
 658                        ATTR_KILL_SUID | ATTR_KILL_SGID | ATTR_KILL_PRIV;
 659        mutex_lock(&inode->i_mutex);
 660        error = notify_change(dentry, &newattrs);
 661        mutex_unlock(&inode->i_mutex);
 662out:
 663        return error;
 664}
 665
 666asmlinkage long sys_chown(const char __user * filename, uid_t user, gid_t group)
 667{
 668        struct nameidata nd;
 669        int error;
 670
 671        error = user_path_walk(filename, &nd);
 672        if (error)
 673                goto out;
 674        error = chown_common(nd.path.dentry, user, group);
 675        path_put(&nd.path);
 676out:
 677        return error;
 678}
 679
 680asmlinkage long sys_fchownat(int dfd, const char __user *filename, uid_t user,
 681                             gid_t group, int flag)
 682{
 683        struct nameidata nd;
 684        int error = -EINVAL;
 685        int follow;
 686
 687        if ((flag & ~AT_SYMLINK_NOFOLLOW) != 0)
 688                goto out;
 689
 690        follow = (flag & AT_SYMLINK_NOFOLLOW) ? 0 : LOOKUP_FOLLOW;
 691        error = __user_walk_fd(dfd, filename, follow, &nd);
 692        if (error)
 693                goto out;
 694        error = chown_common(nd.path.dentry, user, group);
 695        path_put(&nd.path);
 696out:
 697        return error;
 698}
 699
 700asmlinkage long sys_lchown(const char __user * filename, uid_t user, gid_t group)
 701{
 702        struct nameidata nd;
 703        int error;
 704
 705        error = user_path_walk_link(filename, &nd);
 706        if (error)
 707                goto out;
 708        error = chown_common(nd.path.dentry, user, group);
 709        path_put(&nd.path);
 710out:
 711        return error;
 712}
 713
 714
 715asmlinkage long sys_fchown(unsigned int fd, uid_t user, gid_t group)
 716{
 717        struct file * file;
 718        int error = -EBADF;
 719        struct dentry * dentry;
 720
 721        file = fget(fd);
 722        if (!file)
 723                goto out;
 724
 725        dentry = file->f_path.dentry;
 726        audit_inode(NULL, dentry);
 727        error = chown_common(dentry, user, group);
 728        fput(file);
 729out:
 730        return error;
 731}
 732
 733static struct file *__dentry_open(struct dentry *dentry, struct vfsmount *mnt,
 734                                        int flags, struct file *f,
 735                                        int (*open)(struct inode *, struct file *))
 736{
 737        struct inode *inode;
 738        int error;
 739
 740        f->f_flags = flags;
 741        f->f_mode = ((flags+1) & O_ACCMODE) | FMODE_LSEEK |
 742                                FMODE_PREAD | FMODE_PWRITE;
 743        inode = dentry->d_inode;
 744        if (f->f_mode & FMODE_WRITE) {
 745                error = get_write_access(inode);
 746                if (error)
 747                        goto cleanup_file;
 748        }
 749
 750        f->f_mapping = inode->i_mapping;
 751        f->f_path.dentry = dentry;
 752        f->f_path.mnt = mnt;
 753        f->f_pos = 0;
 754        f->f_op = fops_get(inode->i_fop);
 755        file_move(f, &inode->i_sb->s_files);
 756
 757        error = security_dentry_open(f);
 758        if (error)
 759                goto cleanup_all;
 760
 761        if (!open && f->f_op)
 762                open = f->f_op->open;
 763        if (open) {
 764                error = open(inode, f);
 765                if (error)
 766                        goto cleanup_all;
 767        }
 768
 769        f->f_flags &= ~(O_CREAT | O_EXCL | O_NOCTTY | O_TRUNC);
 770
 771        file_ra_state_init(&f->f_ra, f->f_mapping->host->i_mapping);
 772
 773        /* NB: we're sure to have correct a_ops only after f_op->open */
 774        if (f->f_flags & O_DIRECT) {
 775                if (!f->f_mapping->a_ops ||
 776                    ((!f->f_mapping->a_ops->direct_IO) &&
 777                    (!f->f_mapping->a_ops->get_xip_page))) {
 778                        fput(f);
 779                        f = ERR_PTR(-EINVAL);
 780                }
 781        }
 782
 783        return f;
 784
 785cleanup_all:
 786        fops_put(f->f_op);
 787        if (f->f_mode & FMODE_WRITE)
 788                put_write_access(inode);
 789        file_kill(f);
 790        f->f_path.dentry = NULL;
 791        f->f_path.mnt = NULL;
 792cleanup_file:
 793        put_filp(f);
 794        dput(dentry);
 795        mntput(mnt);
 796        return ERR_PTR(error);
 797}
 798
 799/*
 800 * Note that while the flag value (low two bits) for sys_open means:
 801 *      00 - read-only
 802 *      01 - write-only
 803 *      10 - read-write
 804 *      11 - special
 805 * it is changed into
 806 *      00 - no permissions needed
 807 *      01 - read-permission
 808 *      10 - write-permission
 809 *      11 - read-write
 810 * for the internal routines (ie open_namei()/follow_link() etc). 00 is
 811 * used by symlinks.
 812 */
 813static struct file *do_filp_open(int dfd, const char *filename, int flags,
 814                                 int mode)
 815{
 816        int namei_flags, error;
 817        struct nameidata nd;
 818
 819        namei_flags = flags;
 820        if ((namei_flags+1) & O_ACCMODE)
 821                namei_flags++;
 822
 823        error = open_namei(dfd, filename, namei_flags, mode, &nd);
 824        if (!error)
 825                return nameidata_to_filp(&nd, flags);
 826
 827        return ERR_PTR(error);
 828}
 829
 830struct file *filp_open(const char *filename, int flags, int mode)
 831{
 832        return do_filp_open(AT_FDCWD, filename, flags, mode);
 833}
 834EXPORT_SYMBOL(filp_open);
 835
 836/**
 837 * lookup_instantiate_filp - instantiates the open intent filp
 838 * @nd: pointer to nameidata
 839 * @dentry: pointer to dentry
 840 * @open: open callback
 841 *
 842 * Helper for filesystems that want to use lookup open intents and pass back
 843 * a fully instantiated struct file to the caller.
 844 * This function is meant to be called from within a filesystem's
 845 * lookup method.
 846 * Beware of calling it for non-regular files! Those ->open methods might block
 847 * (e.g. in fifo_open), leaving you with parent locked (and in case of fifo,
 848 * leading to a deadlock, as nobody can open that fifo anymore, because
 849 * another process to open fifo will block on locked parent when doing lookup).
 850 * Note that in case of error, nd->intent.open.file is destroyed, but the
 851 * path information remains valid.
 852 * If the open callback is set to NULL, then the standard f_op->open()
 853 * filesystem callback is substituted.
 854 */
 855struct file *lookup_instantiate_filp(struct nameidata *nd, struct dentry *dentry,
 856                int (*open)(struct inode *, struct file *))
 857{
 858        if (IS_ERR(nd->intent.open.file))
 859                goto out;
 860        if (IS_ERR(dentry))
 861                goto out_err;
 862        nd->intent.open.file = __dentry_open(dget(dentry), mntget(nd->path.mnt),
 863                                             nd->intent.open.flags - 1,
 864                                             nd->intent.open.file,
 865                                             open);
 866out:
 867        return nd->intent.open.file;
 868out_err:
 869        release_open_intent(nd);
 870        nd->intent.open.file = (struct file *)dentry;
 871        goto out;
 872}
 873EXPORT_SYMBOL_GPL(lookup_instantiate_filp);
 874
 875/**
 876 * nameidata_to_filp - convert a nameidata to an open filp.
 877 * @nd: pointer to nameidata
 878 * @flags: open flags
 879 *
 880 * Note that this function destroys the original nameidata
 881 */
 882struct file *nameidata_to_filp(struct nameidata *nd, int flags)
 883{
 884        struct file *filp;
 885
 886        /* Pick up the filp from the open intent */
 887        filp = nd->intent.open.file;
 888        /* Has the filesystem initialised the file for us? */
 889        if (filp->f_path.dentry == NULL)
 890                filp = __dentry_open(nd->path.dentry, nd->path.mnt, flags, filp,
 891                                     NULL);
 892        else
 893                path_put(&nd->path);
 894        return filp;
 895}
 896
 897/*
 898 * dentry_open() will have done dput(dentry) and mntput(mnt) if it returns an
 899 * error.
 900 */
 901struct file *dentry_open(struct dentry *dentry, struct vfsmount *mnt, int flags)
 902{
 903        int error;
 904        struct file *f;
 905
 906        /*
 907         * We must always pass in a valid mount pointer.   Historically
 908         * callers got away with not passing it, but we must enforce this at
 909         * the earliest possible point now to avoid strange problems deep in the
 910         * filesystem stack.
 911         */
 912        if (!mnt) {
 913                printk(KERN_WARNING "%s called with NULL vfsmount\n", __func__);
 914                dump_stack();
 915                return ERR_PTR(-EINVAL);
 916        }
 917
 918        error = -ENFILE;
 919        f = get_empty_filp();
 920        if (f == NULL) {
 921                dput(dentry);
 922                mntput(mnt);
 923                return ERR_PTR(error);
 924        }
 925
 926        return __dentry_open(dentry, mnt, flags, f, NULL);
 927}
 928EXPORT_SYMBOL(dentry_open);
 929
 930/*
 931 * Find an empty file descriptor entry, and mark it busy.
 932 */
 933int get_unused_fd_flags(int flags)
 934{
 935        struct files_struct * files = current->files;
 936        int fd, error;
 937        struct fdtable *fdt;
 938
 939        error = -EMFILE;
 940        spin_lock(&files->file_lock);
 941
 942repeat:
 943        fdt = files_fdtable(files);
 944        fd = find_next_zero_bit(fdt->open_fds->fds_bits, fdt->max_fds,
 945                                files->next_fd);
 946
 947        /*
 948         * N.B. For clone tasks sharing a files structure, this test
 949         * will limit the total number of files that can be opened.
 950         */
 951        if (fd >= current->signal->rlim[RLIMIT_NOFILE].rlim_cur)
 952                goto out;
 953
 954        /* Do we need to expand the fd array or fd set?  */
 955        error = expand_files(files, fd);
 956        if (error < 0)
 957                goto out;
 958
 959        if (error) {
 960                /*
 961                 * If we needed to expand the fs array we
 962                 * might have blocked - try again.
 963                 */
 964                error = -EMFILE;
 965                goto repeat;
 966        }
 967
 968        FD_SET(fd, fdt->open_fds);
 969        if (flags & O_CLOEXEC)
 970                FD_SET(fd, fdt->close_on_exec);
 971        else
 972                FD_CLR(fd, fdt->close_on_exec);
 973        files->next_fd = fd + 1;
 974#if 1
 975        /* Sanity check */
 976        if (fdt->fd[fd] != NULL) {
 977                printk(KERN_WARNING "get_unused_fd: slot %d not NULL!\n", fd);
 978                fdt->fd[fd] = NULL;
 979        }
 980#endif
 981        error = fd;
 982
 983out:
 984        spin_unlock(&files->file_lock);
 985        return error;
 986}
 987
 988int get_unused_fd(void)
 989{
 990        return get_unused_fd_flags(0);
 991}
 992
 993EXPORT_SYMBOL(get_unused_fd);
 994
 995static void __put_unused_fd(struct files_struct *files, unsigned int fd)
 996{
 997        struct fdtable *fdt = files_fdtable(files);
 998        __FD_CLR(fd, fdt->open_fds);
 999        if (fd < files->next_fd)
1000                files->next_fd = fd;
1001}
1002
1003void put_unused_fd(unsigned int fd)
1004{
1005        struct files_struct *files = current->files;
1006        spin_lock(&files->file_lock);
1007        __put_unused_fd(files, fd);
1008        spin_unlock(&files->file_lock);
1009}
1010
1011EXPORT_SYMBOL(put_unused_fd);
1012
1013/*
1014 * Install a file pointer in the fd array.
1015 *
1016 * The VFS is full of places where we drop the files lock between
1017 * setting the open_fds bitmap and installing the file in the file
1018 * array.  At any such point, we are vulnerable to a dup2() race
1019 * installing a file in the array before us.  We need to detect this and
1020 * fput() the struct file we are about to overwrite in this case.
1021 *
1022 * It should never happen - if we allow dup2() do it, _really_ bad things
1023 * will follow.
1024 */
1025
1026void fd_install(unsigned int fd, struct file *file)
1027{
1028        struct files_struct *files = current->files;
1029        struct fdtable *fdt;
1030        spin_lock(&files->file_lock);
1031        fdt = files_fdtable(files);
1032        BUG_ON(fdt->fd[fd] != NULL);
1033        rcu_assign_pointer(fdt->fd[fd], file);
1034        spin_unlock(&files->file_lock);
1035}
1036
1037EXPORT_SYMBOL(fd_install);
1038
1039long do_sys_open(int dfd, const char __user *filename, int flags, int mode)
1040{
1041        char *tmp = getname(filename);
1042        int fd = PTR_ERR(tmp);
1043
1044        if (!IS_ERR(tmp)) {
1045                fd = get_unused_fd_flags(flags);
1046                if (fd >= 0) {
1047                        struct file *f = do_filp_open(dfd, tmp, flags, mode);
1048                        if (IS_ERR(f)) {
1049                                put_unused_fd(fd);
1050                                fd = PTR_ERR(f);
1051                        } else {
1052                                fsnotify_open(f->f_path.dentry);
1053                                fd_install(fd, f);
1054                        }
1055                }
1056                putname(tmp);
1057        }
1058        return fd;
1059}
1060
1061asmlinkage long sys_open(const char __user *filename, int flags, int mode)
1062{
1063        long ret;
1064
1065        if (force_o_largefile())
1066                flags |= O_LARGEFILE;
1067
1068        ret = do_sys_open(AT_FDCWD, filename, flags, mode);
1069        /* avoid REGPARM breakage on x86: */
1070        asmlinkage_protect(3, ret, filename, flags, mode);
1071        return ret;
1072}
1073
1074asmlinkage long sys_openat(int dfd, const char __user *filename, int flags,
1075                           int mode)
1076{
1077        long ret;
1078
1079        if (force_o_largefile())
1080                flags |= O_LARGEFILE;
1081
1082        ret = do_sys_open(dfd, filename, flags, mode);
1083        /* avoid REGPARM breakage on x86: */
1084        asmlinkage_protect(4, ret, dfd, filename, flags, mode);
1085        return ret;
1086}
1087
1088#ifndef __alpha__
1089
1090/*
1091 * For backward compatibility?  Maybe this should be moved
1092 * into arch/i386 instead?
1093 */
1094asmlinkage long sys_creat(const char __user * pathname, int mode)
1095{
1096        return sys_open(pathname, O_CREAT | O_WRONLY | O_TRUNC, mode);
1097}
1098
1099#endif
1100
1101/*
1102 * "id" is the POSIX thread ID. We use the
1103 * files pointer for this..
1104 */
1105int filp_close(struct file *filp, fl_owner_t id)
1106{
1107        int retval = 0;
1108
1109        if (!file_count(filp)) {
1110                printk(KERN_ERR "VFS: Close: file count is 0\n");
1111                return 0;
1112        }
1113
1114        if (filp->f_op && filp->f_op->flush)
1115                retval = filp->f_op->flush(filp, id);
1116
1117        dnotify_flush(filp, id);
1118        locks_remove_posix(filp, id);
1119        fput(filp);
1120        return retval;
1121}
1122
1123EXPORT_SYMBOL(filp_close);
1124
1125/*
1126 * Careful here! We test whether the file pointer is NULL before
1127 * releasing the fd. This ensures that one clone task can't release
1128 * an fd while another clone is opening it.
1129 */
1130asmlinkage long sys_close(unsigned int fd)
1131{
1132        struct file * filp;
1133        struct files_struct *files = current->files;
1134        struct fdtable *fdt;
1135        int retval;
1136
1137        spin_lock(&files->file_lock);
1138        fdt = files_fdtable(files);
1139        if (fd >= fdt->max_fds)
1140                goto out_unlock;
1141        filp = fdt->fd[fd];
1142        if (!filp)
1143                goto out_unlock;
1144        rcu_assign_pointer(fdt->fd[fd], NULL);
1145        FD_CLR(fd, fdt->close_on_exec);
1146        __put_unused_fd(files, fd);
1147        spin_unlock(&files->file_lock);
1148        retval = filp_close(filp, files);
1149
1150        /* can't restart close syscall because file table entry was cleared */
1151        if (unlikely(retval == -ERESTARTSYS ||
1152                     retval == -ERESTARTNOINTR ||
1153                     retval == -ERESTARTNOHAND ||
1154                     retval == -ERESTART_RESTARTBLOCK))
1155                retval = -EINTR;
1156
1157        return retval;
1158
1159out_unlock:
1160        spin_unlock(&files->file_lock);
1161        return -EBADF;
1162}
1163
1164EXPORT_SYMBOL(sys_close);
1165
1166/*
1167 * This routine simulates a hangup on the tty, to arrange that users
1168 * are given clean terminals at login time.
1169 */
1170asmlinkage long sys_vhangup(void)
1171{
1172        if (capable(CAP_SYS_TTY_CONFIG)) {
1173                /* XXX: this needs locking */
1174                tty_vhangup(current->signal->tty);
1175                return 0;
1176        }
1177        return -EPERM;
1178}
1179
1180/*
1181 * Called when an inode is about to be open.
1182 * We use this to disallow opening large files on 32bit systems if
1183 * the caller didn't specify O_LARGEFILE.  On 64bit systems we force
1184 * on this flag in sys_open.
1185 */
1186int generic_file_open(struct inode * inode, struct file * filp)
1187{
1188        if (!(filp->f_flags & O_LARGEFILE) && i_size_read(inode) > MAX_NON_LFS)
1189                return -EOVERFLOW;
1190        return 0;
1191}
1192
1193EXPORT_SYMBOL(generic_file_open);
1194
1195/*
1196 * This is used by subsystems that don't want seekable
1197 * file descriptors
1198 */
1199int nonseekable_open(struct inode *inode, struct file *filp)
1200{
1201        filp->f_mode &= ~(FMODE_LSEEK | FMODE_PREAD | FMODE_PWRITE);
1202        return 0;
1203}
1204
1205EXPORT_SYMBOL(nonseekable_open);
1206
lxr.linux.no kindly hosted by Redpill Linpro AS, provider of Linux consulting and operations services since 1995.