linux/fs/fuse/dir.c
<<
>>
Prefs
   1/*
   2  FUSE: Filesystem in Userspace
   3  Copyright (C) 2001-2008  Miklos Szeredi <miklos@szeredi.hu>
   4
   5  This program can be distributed under the terms of the GNU GPL.
   6  See the file COPYING.
   7*/
   8
   9#include "fuse_i.h"
  10
  11#include <linux/pagemap.h>
  12#include <linux/file.h>
  13#include <linux/sched.h>
  14#include <linux/namei.h>
  15#include <linux/slab.h>
  16
  17#if BITS_PER_LONG >= 64
  18static inline void fuse_dentry_settime(struct dentry *entry, u64 time)
  19{
  20        entry->d_time = time;
  21}
  22
  23static inline u64 fuse_dentry_time(struct dentry *entry)
  24{
  25        return entry->d_time;
  26}
  27#else
  28/*
  29 * On 32 bit archs store the high 32 bits of time in d_fsdata
  30 */
  31static void fuse_dentry_settime(struct dentry *entry, u64 time)
  32{
  33        entry->d_time = time;
  34        entry->d_fsdata = (void *) (unsigned long) (time >> 32);
  35}
  36
  37static u64 fuse_dentry_time(struct dentry *entry)
  38{
  39        return (u64) entry->d_time +
  40                ((u64) (unsigned long) entry->d_fsdata << 32);
  41}
  42#endif
  43
  44/*
  45 * FUSE caches dentries and attributes with separate timeout.  The
  46 * time in jiffies until the dentry/attributes are valid is stored in
  47 * dentry->d_time and fuse_inode->i_time respectively.
  48 */
  49
  50/*
  51 * Calculate the time in jiffies until a dentry/attributes are valid
  52 */
  53static u64 time_to_jiffies(unsigned long sec, unsigned long nsec)
  54{
  55        if (sec || nsec) {
  56                struct timespec ts = {sec, nsec};
  57                return get_jiffies_64() + timespec_to_jiffies(&ts);
  58        } else
  59                return 0;
  60}
  61
  62/*
  63 * Set dentry and possibly attribute timeouts from the lookup/mk*
  64 * replies
  65 */
  66static void fuse_change_entry_timeout(struct dentry *entry,
  67                                      struct fuse_entry_out *o)
  68{
  69        fuse_dentry_settime(entry,
  70                time_to_jiffies(o->entry_valid, o->entry_valid_nsec));
  71}
  72
  73static u64 attr_timeout(struct fuse_attr_out *o)
  74{
  75        return time_to_jiffies(o->attr_valid, o->attr_valid_nsec);
  76}
  77
  78static u64 entry_attr_timeout(struct fuse_entry_out *o)
  79{
  80        return time_to_jiffies(o->attr_valid, o->attr_valid_nsec);
  81}
  82
  83/*
  84 * Mark the attributes as stale, so that at the next call to
  85 * ->getattr() they will be fetched from userspace
  86 */
  87void fuse_invalidate_attr(struct inode *inode)
  88{
  89        get_fuse_inode(inode)->i_time = 0;
  90}
  91
  92/*
  93 * Just mark the entry as stale, so that a next attempt to look it up
  94 * will result in a new lookup call to userspace
  95 *
  96 * This is called when a dentry is about to become negative and the
  97 * timeout is unknown (unlink, rmdir, rename and in some cases
  98 * lookup)
  99 */
 100void fuse_invalidate_entry_cache(struct dentry *entry)
 101{
 102        fuse_dentry_settime(entry, 0);
 103}
 104
 105/*
 106 * Same as fuse_invalidate_entry_cache(), but also try to remove the
 107 * dentry from the hash
 108 */
 109static void fuse_invalidate_entry(struct dentry *entry)
 110{
 111        d_invalidate(entry);
 112        fuse_invalidate_entry_cache(entry);
 113}
 114
 115static void fuse_lookup_init(struct fuse_conn *fc, struct fuse_req *req,
 116                             u64 nodeid, struct qstr *name,
 117                             struct fuse_entry_out *outarg)
 118{
 119        memset(outarg, 0, sizeof(struct fuse_entry_out));
 120        req->in.h.opcode = FUSE_LOOKUP;
 121        req->in.h.nodeid = nodeid;
 122        req->in.numargs = 1;
 123        req->in.args[0].size = name->len + 1;
 124        req->in.args[0].value = name->name;
 125        req->out.numargs = 1;
 126        if (fc->minor < 9)
 127                req->out.args[0].size = FUSE_COMPAT_ENTRY_OUT_SIZE;
 128        else
 129                req->out.args[0].size = sizeof(struct fuse_entry_out);
 130        req->out.args[0].value = outarg;
 131}
 132
 133u64 fuse_get_attr_version(struct fuse_conn *fc)
 134{
 135        u64 curr_version;
 136
 137        /*
 138         * The spin lock isn't actually needed on 64bit archs, but we
 139         * don't yet care too much about such optimizations.
 140         */
 141        spin_lock(&fc->lock);
 142        curr_version = fc->attr_version;
 143        spin_unlock(&fc->lock);
 144
 145        return curr_version;
 146}
 147
 148/*
 149 * Check whether the dentry is still valid
 150 *
 151 * If the entry validity timeout has expired and the dentry is
 152 * positive, try to redo the lookup.  If the lookup results in a
 153 * different inode, then let the VFS invalidate the dentry and redo
 154 * the lookup once more.  If the lookup results in the same inode,
 155 * then refresh the attributes, timeouts and mark the dentry valid.
 156 */
 157static int fuse_dentry_revalidate(struct dentry *entry, struct nameidata *nd)
 158{
 159        struct inode *inode;
 160
 161        inode = ACCESS_ONCE(entry->d_inode);
 162        if (inode && is_bad_inode(inode))
 163                return 0;
 164        else if (fuse_dentry_time(entry) < get_jiffies_64()) {
 165                int err;
 166                struct fuse_entry_out outarg;
 167                struct fuse_conn *fc;
 168                struct fuse_req *req;
 169                struct fuse_forget_link *forget;
 170                struct dentry *parent;
 171                u64 attr_version;
 172
 173                /* For negative dentries, always do a fresh lookup */
 174                if (!inode)
 175                        return 0;
 176
 177                if (nd && (nd->flags & LOOKUP_RCU))
 178                        return -ECHILD;
 179
 180                fc = get_fuse_conn(inode);
 181                req = fuse_get_req(fc);
 182                if (IS_ERR(req))
 183                        return 0;
 184
 185                forget = fuse_alloc_forget();
 186                if (!forget) {
 187                        fuse_put_request(fc, req);
 188                        return 0;
 189                }
 190
 191                attr_version = fuse_get_attr_version(fc);
 192
 193                parent = dget_parent(entry);
 194                fuse_lookup_init(fc, req, get_node_id(parent->d_inode),
 195                                 &entry->d_name, &outarg);
 196                fuse_request_send(fc, req);
 197                dput(parent);
 198                err = req->out.h.error;
 199                fuse_put_request(fc, req);
 200                /* Zero nodeid is same as -ENOENT */
 201                if (!err && !outarg.nodeid)
 202                        err = -ENOENT;
 203                if (!err) {
 204                        struct fuse_inode *fi = get_fuse_inode(inode);
 205                        if (outarg.nodeid != get_node_id(inode)) {
 206                                fuse_queue_forget(fc, forget, outarg.nodeid, 1);
 207                                return 0;
 208                        }
 209                        spin_lock(&fc->lock);
 210                        fi->nlookup++;
 211                        spin_unlock(&fc->lock);
 212                }
 213                kfree(forget);
 214                if (err || (outarg.attr.mode ^ inode->i_mode) & S_IFMT)
 215                        return 0;
 216
 217                fuse_change_attributes(inode, &outarg.attr,
 218                                       entry_attr_timeout(&outarg),
 219                                       attr_version);
 220                fuse_change_entry_timeout(entry, &outarg);
 221        }
 222        return 1;
 223}
 224
 225static int invalid_nodeid(u64 nodeid)
 226{
 227        return !nodeid || nodeid == FUSE_ROOT_ID;
 228}
 229
 230const struct dentry_operations fuse_dentry_operations = {
 231        .d_revalidate   = fuse_dentry_revalidate,
 232};
 233
 234int fuse_valid_type(int m)
 235{
 236        return S_ISREG(m) || S_ISDIR(m) || S_ISLNK(m) || S_ISCHR(m) ||
 237                S_ISBLK(m) || S_ISFIFO(m) || S_ISSOCK(m);
 238}
 239
 240/*
 241 * Add a directory inode to a dentry, ensuring that no other dentry
 242 * refers to this inode.  Called with fc->inst_mutex.
 243 */
 244static struct dentry *fuse_d_add_directory(struct dentry *entry,
 245                                           struct inode *inode)
 246{
 247        struct dentry *alias = d_find_alias(inode);
 248        if (alias && !(alias->d_flags & DCACHE_DISCONNECTED)) {
 249                /* This tries to shrink the subtree below alias */
 250                fuse_invalidate_entry(alias);
 251                dput(alias);
 252                if (!list_empty(&inode->i_dentry))
 253                        return ERR_PTR(-EBUSY);
 254        } else {
 255                dput(alias);
 256        }
 257        return d_splice_alias(inode, entry);
 258}
 259
 260int fuse_lookup_name(struct super_block *sb, u64 nodeid, struct qstr *name,
 261                     struct fuse_entry_out *outarg, struct inode **inode)
 262{
 263        struct fuse_conn *fc = get_fuse_conn_super(sb);
 264        struct fuse_req *req;
 265        struct fuse_forget_link *forget;
 266        u64 attr_version;
 267        int err;
 268
 269        *inode = NULL;
 270        err = -ENAMETOOLONG;
 271        if (name->len > FUSE_NAME_MAX)
 272                goto out;
 273
 274        req = fuse_get_req(fc);
 275        err = PTR_ERR(req);
 276        if (IS_ERR(req))
 277                goto out;
 278
 279        forget = fuse_alloc_forget();
 280        err = -ENOMEM;
 281        if (!forget) {
 282                fuse_put_request(fc, req);
 283                goto out;
 284        }
 285
 286        attr_version = fuse_get_attr_version(fc);
 287
 288        fuse_lookup_init(fc, req, nodeid, name, outarg);
 289        fuse_request_send(fc, req);
 290        err = req->out.h.error;
 291        fuse_put_request(fc, req);
 292        /* Zero nodeid is same as -ENOENT, but with valid timeout */
 293        if (err || !outarg->nodeid)
 294                goto out_put_forget;
 295
 296        err = -EIO;
 297        if (!outarg->nodeid)
 298                goto out_put_forget;
 299        if (!fuse_valid_type(outarg->attr.mode))
 300                goto out_put_forget;
 301
 302        *inode = fuse_iget(sb, outarg->nodeid, outarg->generation,
 303                           &outarg->attr, entry_attr_timeout(outarg),
 304                           attr_version);
 305        err = -ENOMEM;
 306        if (!*inode) {
 307                fuse_queue_forget(fc, forget, outarg->nodeid, 1);
 308                goto out;
 309        }
 310        err = 0;
 311
 312 out_put_forget:
 313        kfree(forget);
 314 out:
 315        return err;
 316}
 317
 318static struct dentry *fuse_lookup(struct inode *dir, struct dentry *entry,
 319                                  struct nameidata *nd)
 320{
 321        int err;
 322        struct fuse_entry_out outarg;
 323        struct inode *inode;
 324        struct dentry *newent;
 325        struct fuse_conn *fc = get_fuse_conn(dir);
 326        bool outarg_valid = true;
 327
 328        err = fuse_lookup_name(dir->i_sb, get_node_id(dir), &entry->d_name,
 329                               &outarg, &inode);
 330        if (err == -ENOENT) {
 331                outarg_valid = false;
 332                err = 0;
 333        }
 334        if (err)
 335                goto out_err;
 336
 337        err = -EIO;
 338        if (inode && get_node_id(inode) == FUSE_ROOT_ID)
 339                goto out_iput;
 340
 341        if (inode && S_ISDIR(inode->i_mode)) {
 342                mutex_lock(&fc->inst_mutex);
 343                newent = fuse_d_add_directory(entry, inode);
 344                mutex_unlock(&fc->inst_mutex);
 345                err = PTR_ERR(newent);
 346                if (IS_ERR(newent))
 347                        goto out_iput;
 348        } else {
 349                newent = d_splice_alias(inode, entry);
 350        }
 351
 352        entry = newent ? newent : entry;
 353        if (outarg_valid)
 354                fuse_change_entry_timeout(entry, &outarg);
 355        else
 356                fuse_invalidate_entry_cache(entry);
 357
 358        return newent;
 359
 360 out_iput:
 361        iput(inode);
 362 out_err:
 363        return ERR_PTR(err);
 364}
 365
 366/*
 367 * Atomic create+open operation
 368 *
 369 * If the filesystem doesn't support this, then fall back to separate
 370 * 'mknod' + 'open' requests.
 371 */
 372static int fuse_create_open(struct inode *dir, struct dentry *entry,
 373                            umode_t mode, struct nameidata *nd)
 374{
 375        int err;
 376        struct inode *inode;
 377        struct fuse_conn *fc = get_fuse_conn(dir);
 378        struct fuse_req *req;
 379        struct fuse_forget_link *forget;
 380        struct fuse_create_in inarg;
 381        struct fuse_open_out outopen;
 382        struct fuse_entry_out outentry;
 383        struct fuse_file *ff;
 384        struct file *file;
 385        int flags = nd->intent.open.flags;
 386
 387        if (fc->no_create)
 388                return -ENOSYS;
 389
 390        if (flags & O_DIRECT)
 391                return -EINVAL;
 392
 393        forget = fuse_alloc_forget();
 394        if (!forget)
 395                return -ENOMEM;
 396
 397        req = fuse_get_req(fc);
 398        err = PTR_ERR(req);
 399        if (IS_ERR(req))
 400                goto out_put_forget_req;
 401
 402        err = -ENOMEM;
 403        ff = fuse_file_alloc(fc);
 404        if (!ff)
 405                goto out_put_request;
 406
 407        if (!fc->dont_mask)
 408                mode &= ~current_umask();
 409
 410        flags &= ~O_NOCTTY;
 411        memset(&inarg, 0, sizeof(inarg));
 412        memset(&outentry, 0, sizeof(outentry));
 413        inarg.flags = flags;
 414        inarg.mode = mode;
 415        inarg.umask = current_umask();
 416        req->in.h.opcode = FUSE_CREATE;
 417        req->in.h.nodeid = get_node_id(dir);
 418        req->in.numargs = 2;
 419        req->in.args[0].size = fc->minor < 12 ? sizeof(struct fuse_open_in) :
 420                                                sizeof(inarg);
 421        req->in.args[0].value = &inarg;
 422        req->in.args[1].size = entry->d_name.len + 1;
 423        req->in.args[1].value = entry->d_name.name;
 424        req->out.numargs = 2;
 425        if (fc->minor < 9)
 426                req->out.args[0].size = FUSE_COMPAT_ENTRY_OUT_SIZE;
 427        else
 428                req->out.args[0].size = sizeof(outentry);
 429        req->out.args[0].value = &outentry;
 430        req->out.args[1].size = sizeof(outopen);
 431        req->out.args[1].value = &outopen;
 432        fuse_request_send(fc, req);
 433        err = req->out.h.error;
 434        if (err) {
 435                if (err == -ENOSYS)
 436                        fc->no_create = 1;
 437                goto out_free_ff;
 438        }
 439
 440        err = -EIO;
 441        if (!S_ISREG(outentry.attr.mode) || invalid_nodeid(outentry.nodeid))
 442                goto out_free_ff;
 443
 444        fuse_put_request(fc, req);
 445        ff->fh = outopen.fh;
 446        ff->nodeid = outentry.nodeid;
 447        ff->open_flags = outopen.open_flags;
 448        inode = fuse_iget(dir->i_sb, outentry.nodeid, outentry.generation,
 449                          &outentry.attr, entry_attr_timeout(&outentry), 0);
 450        if (!inode) {
 451                flags &= ~(O_CREAT | O_EXCL | O_TRUNC);
 452                fuse_sync_release(ff, flags);
 453                fuse_queue_forget(fc, forget, outentry.nodeid, 1);
 454                return -ENOMEM;
 455        }
 456        kfree(forget);
 457        d_instantiate(entry, inode);
 458        fuse_change_entry_timeout(entry, &outentry);
 459        fuse_invalidate_attr(dir);
 460        file = lookup_instantiate_filp(nd, entry, generic_file_open);
 461        if (IS_ERR(file)) {
 462                fuse_sync_release(ff, flags);
 463                return PTR_ERR(file);
 464        }
 465        file->private_data = fuse_file_get(ff);
 466        fuse_finish_open(inode, file);
 467        return 0;
 468
 469 out_free_ff:
 470        fuse_file_free(ff);
 471 out_put_request:
 472        fuse_put_request(fc, req);
 473 out_put_forget_req:
 474        kfree(forget);
 475        return err;
 476}
 477
 478/*
 479 * Code shared between mknod, mkdir, symlink and link
 480 */
 481static int create_new_entry(struct fuse_conn *fc, struct fuse_req *req,
 482                            struct inode *dir, struct dentry *entry,
 483                            umode_t mode)
 484{
 485        struct fuse_entry_out outarg;
 486        struct inode *inode;
 487        int err;
 488        struct fuse_forget_link *forget;
 489
 490        forget = fuse_alloc_forget();
 491        if (!forget) {
 492                fuse_put_request(fc, req);
 493                return -ENOMEM;
 494        }
 495
 496        memset(&outarg, 0, sizeof(outarg));
 497        req->in.h.nodeid = get_node_id(dir);
 498        req->out.numargs = 1;
 499        if (fc->minor < 9)
 500                req->out.args[0].size = FUSE_COMPAT_ENTRY_OUT_SIZE;
 501        else
 502                req->out.args[0].size = sizeof(outarg);
 503        req->out.args[0].value = &outarg;
 504        fuse_request_send(fc, req);
 505        err = req->out.h.error;
 506        fuse_put_request(fc, req);
 507        if (err)
 508                goto out_put_forget_req;
 509
 510        err = -EIO;
 511        if (invalid_nodeid(outarg.nodeid))
 512                goto out_put_forget_req;
 513
 514        if ((outarg.attr.mode ^ mode) & S_IFMT)
 515                goto out_put_forget_req;
 516
 517        inode = fuse_iget(dir->i_sb, outarg.nodeid, outarg.generation,
 518                          &outarg.attr, entry_attr_timeout(&outarg), 0);
 519        if (!inode) {
 520                fuse_queue_forget(fc, forget, outarg.nodeid, 1);
 521                return -ENOMEM;
 522        }
 523        kfree(forget);
 524
 525        if (S_ISDIR(inode->i_mode)) {
 526                struct dentry *alias;
 527                mutex_lock(&fc->inst_mutex);
 528                alias = d_find_alias(inode);
 529                if (alias) {
 530                        /* New directory must have moved since mkdir */
 531                        mutex_unlock(&fc->inst_mutex);
 532                        dput(alias);
 533                        iput(inode);
 534                        return -EBUSY;
 535                }
 536                d_instantiate(entry, inode);
 537                mutex_unlock(&fc->inst_mutex);
 538        } else
 539                d_instantiate(entry, inode);
 540
 541        fuse_change_entry_timeout(entry, &outarg);
 542        fuse_invalidate_attr(dir);
 543        return 0;
 544
 545 out_put_forget_req:
 546        kfree(forget);
 547        return err;
 548}
 549
 550static int fuse_mknod(struct inode *dir, struct dentry *entry, umode_t mode,
 551                      dev_t rdev)
 552{
 553        struct fuse_mknod_in inarg;
 554        struct fuse_conn *fc = get_fuse_conn(dir);
 555        struct fuse_req *req = fuse_get_req(fc);
 556        if (IS_ERR(req))
 557                return PTR_ERR(req);
 558
 559        if (!fc->dont_mask)
 560                mode &= ~current_umask();
 561
 562        memset(&inarg, 0, sizeof(inarg));
 563        inarg.mode = mode;
 564        inarg.rdev = new_encode_dev(rdev);
 565        inarg.umask = current_umask();
 566        req->in.h.opcode = FUSE_MKNOD;
 567        req->in.numargs = 2;
 568        req->in.args[0].size = fc->minor < 12 ? FUSE_COMPAT_MKNOD_IN_SIZE :
 569                                                sizeof(inarg);
 570        req->in.args[0].value = &inarg;
 571        req->in.args[1].size = entry->d_name.len + 1;
 572        req->in.args[1].value = entry->d_name.name;
 573        return create_new_entry(fc, req, dir, entry, mode);
 574}
 575
 576static int fuse_create(struct inode *dir, struct dentry *entry, umode_t mode,
 577                       struct nameidata *nd)
 578{
 579        if (nd) {
 580                int err = fuse_create_open(dir, entry, mode, nd);
 581                if (err != -ENOSYS)
 582                        return err;
 583                /* Fall back on mknod */
 584        }
 585        return fuse_mknod(dir, entry, mode, 0);
 586}
 587
 588static int fuse_mkdir(struct inode *dir, struct dentry *entry, umode_t mode)
 589{
 590        struct fuse_mkdir_in inarg;
 591        struct fuse_conn *fc = get_fuse_conn(dir);
 592        struct fuse_req *req = fuse_get_req(fc);
 593        if (IS_ERR(req))
 594                return PTR_ERR(req);
 595
 596        if (!fc->dont_mask)
 597                mode &= ~current_umask();
 598
 599        memset(&inarg, 0, sizeof(inarg));
 600        inarg.mode = mode;
 601        inarg.umask = current_umask();
 602        req->in.h.opcode = FUSE_MKDIR;
 603        req->in.numargs = 2;
 604        req->in.args[0].size = sizeof(inarg);
 605        req->in.args[0].value = &inarg;
 606        req->in.args[1].size = entry->d_name.len + 1;
 607        req->in.args[1].value = entry->d_name.name;
 608        return create_new_entry(fc, req, dir, entry, S_IFDIR);
 609}
 610
 611static int fuse_symlink(struct inode *dir, struct dentry *entry,
 612                        const char *link)
 613{
 614        struct fuse_conn *fc = get_fuse_conn(dir);
 615        unsigned len = strlen(link) + 1;
 616        struct fuse_req *req = fuse_get_req(fc);
 617        if (IS_ERR(req))
 618                return PTR_ERR(req);
 619
 620        req->in.h.opcode = FUSE_SYMLINK;
 621        req->in.numargs = 2;
 622        req->in.args[0].size = entry->d_name.len + 1;
 623        req->in.args[0].value = entry->d_name.name;
 624        req->in.args[1].size = len;
 625        req->in.args[1].value = link;
 626        return create_new_entry(fc, req, dir, entry, S_IFLNK);
 627}
 628
 629static int fuse_unlink(struct inode *dir, struct dentry *entry)
 630{
 631        int err;
 632        struct fuse_conn *fc = get_fuse_conn(dir);
 633        struct fuse_req *req = fuse_get_req(fc);
 634        if (IS_ERR(req))
 635                return PTR_ERR(req);
 636
 637        req->in.h.opcode = FUSE_UNLINK;
 638        req->in.h.nodeid = get_node_id(dir);
 639        req->in.numargs = 1;
 640        req->in.args[0].size = entry->d_name.len + 1;
 641        req->in.args[0].value = entry->d_name.name;
 642        fuse_request_send(fc, req);
 643        err = req->out.h.error;
 644        fuse_put_request(fc, req);
 645        if (!err) {
 646                struct inode *inode = entry->d_inode;
 647
 648                /*
 649                 * Set nlink to zero so the inode can be cleared, if the inode
 650                 * does have more links this will be discovered at the next
 651                 * lookup/getattr.
 652                 */
 653                clear_nlink(inode);
 654                fuse_invalidate_attr(inode);
 655                fuse_invalidate_attr(dir);
 656                fuse_invalidate_entry_cache(entry);
 657        } else if (err == -EINTR)
 658                fuse_invalidate_entry(entry);
 659        return err;
 660}
 661
 662static int fuse_rmdir(struct inode *dir, struct dentry *entry)
 663{
 664        int err;
 665        struct fuse_conn *fc = get_fuse_conn(dir);
 666        struct fuse_req *req = fuse_get_req(fc);
 667        if (IS_ERR(req))
 668                return PTR_ERR(req);
 669
 670        req->in.h.opcode = FUSE_RMDIR;
 671        req->in.h.nodeid = get_node_id(dir);
 672        req->in.numargs = 1;
 673        req->in.args[0].size = entry->d_name.len + 1;
 674        req->in.args[0].value = entry->d_name.name;
 675        fuse_request_send(fc, req);
 676        err = req->out.h.error;
 677        fuse_put_request(fc, req);
 678        if (!err) {
 679                clear_nlink(entry->d_inode);
 680                fuse_invalidate_attr(dir);
 681                fuse_invalidate_entry_cache(entry);
 682        } else if (err == -EINTR)
 683                fuse_invalidate_entry(entry);
 684        return err;
 685}
 686
 687static int fuse_rename(struct inode *olddir, struct dentry *oldent,
 688                       struct inode *newdir, struct dentry *newent)
 689{
 690        int err;
 691        struct fuse_rename_in inarg;
 692        struct fuse_conn *fc = get_fuse_conn(olddir);
 693        struct fuse_req *req = fuse_get_req(fc);
 694
 695        if (IS_ERR(req))
 696                return PTR_ERR(req);
 697
 698        memset(&inarg, 0, sizeof(inarg));
 699        inarg.newdir = get_node_id(newdir);
 700        req->in.h.opcode = FUSE_RENAME;
 701        req->in.h.nodeid = get_node_id(olddir);
 702        req->in.numargs = 3;
 703        req->in.args[0].size = sizeof(inarg);
 704        req->in.args[0].value = &inarg;
 705        req->in.args[1].size = oldent->d_name.len + 1;
 706        req->in.args[1].value = oldent->d_name.name;
 707        req->in.args[2].size = newent->d_name.len + 1;
 708        req->in.args[2].value = newent->d_name.name;
 709        fuse_request_send(fc, req);
 710        err = req->out.h.error;
 711        fuse_put_request(fc, req);
 712        if (!err) {
 713                /* ctime changes */
 714                fuse_invalidate_attr(oldent->d_inode);
 715
 716                fuse_invalidate_attr(olddir);
 717                if (olddir != newdir)
 718                        fuse_invalidate_attr(newdir);
 719
 720                /* newent will end up negative */
 721                if (newent->d_inode) {
 722                        fuse_invalidate_attr(newent->d_inode);
 723                        fuse_invalidate_entry_cache(newent);
 724                }
 725        } else if (err == -EINTR) {
 726                /* If request was interrupted, DEITY only knows if the
 727                   rename actually took place.  If the invalidation
 728                   fails (e.g. some process has CWD under the renamed
 729                   directory), then there can be inconsistency between
 730                   the dcache and the real filesystem.  Tough luck. */
 731                fuse_invalidate_entry(oldent);
 732                if (newent->d_inode)
 733                        fuse_invalidate_entry(newent);
 734        }
 735
 736        return err;
 737}
 738
 739static int fuse_link(struct dentry *entry, struct inode *newdir,
 740                     struct dentry *newent)
 741{
 742        int err;
 743        struct fuse_link_in inarg;
 744        struct inode *inode = entry->d_inode;
 745        struct fuse_conn *fc = get_fuse_conn(inode);
 746        struct fuse_req *req = fuse_get_req(fc);
 747        if (IS_ERR(req))
 748                return PTR_ERR(req);
 749
 750        memset(&inarg, 0, sizeof(inarg));
 751        inarg.oldnodeid = get_node_id(inode);
 752        req->in.h.opcode = FUSE_LINK;
 753        req->in.numargs = 2;
 754        req->in.args[0].size = sizeof(inarg);
 755        req->in.args[0].value = &inarg;
 756        req->in.args[1].size = newent->d_name.len + 1;
 757        req->in.args[1].value = newent->d_name.name;
 758        err = create_new_entry(fc, req, newdir, newent, inode->i_mode);
 759        /* Contrary to "normal" filesystems it can happen that link
 760           makes two "logical" inodes point to the same "physical"
 761           inode.  We invalidate the attributes of the old one, so it
 762           will reflect changes in the backing inode (link count,
 763           etc.)
 764        */
 765        if (!err || err == -EINTR)
 766                fuse_invalidate_attr(inode);
 767        return err;
 768}
 769
 770static void fuse_fillattr(struct inode *inode, struct fuse_attr *attr,
 771                          struct kstat *stat)
 772{
 773        stat->dev = inode->i_sb->s_dev;
 774        stat->ino = attr->ino;
 775        stat->mode = (inode->i_mode & S_IFMT) | (attr->mode & 07777);
 776        stat->nlink = attr->nlink;
 777        stat->uid = attr->uid;
 778        stat->gid = attr->gid;
 779        stat->rdev = inode->i_rdev;
 780        stat->atime.tv_sec = attr->atime;
 781        stat->atime.tv_nsec = attr->atimensec;
 782        stat->mtime.tv_sec = attr->mtime;
 783        stat->mtime.tv_nsec = attr->mtimensec;
 784        stat->ctime.tv_sec = attr->ctime;
 785        stat->ctime.tv_nsec = attr->ctimensec;
 786        stat->size = attr->size;
 787        stat->blocks = attr->blocks;
 788        stat->blksize = (1 << inode->i_blkbits);
 789}
 790
 791static int fuse_do_getattr(struct inode *inode, struct kstat *stat,
 792                           struct file *file)
 793{
 794        int err;
 795        struct fuse_getattr_in inarg;
 796        struct fuse_attr_out outarg;
 797        struct fuse_conn *fc = get_fuse_conn(inode);
 798        struct fuse_req *req;
 799        u64 attr_version;
 800
 801        req = fuse_get_req(fc);
 802        if (IS_ERR(req))
 803                return PTR_ERR(req);
 804
 805        attr_version = fuse_get_attr_version(fc);
 806
 807        memset(&inarg, 0, sizeof(inarg));
 808        memset(&outarg, 0, sizeof(outarg));
 809        /* Directories have separate file-handle space */
 810        if (file && S_ISREG(inode->i_mode)) {
 811                struct fuse_file *ff = file->private_data;
 812
 813                inarg.getattr_flags |= FUSE_GETATTR_FH;
 814                inarg.fh = ff->fh;
 815        }
 816        req->in.h.opcode = FUSE_GETATTR;
 817        req->in.h.nodeid = get_node_id(inode);
 818        req->in.numargs = 1;
 819        req->in.args[0].size = sizeof(inarg);
 820        req->in.args[0].value = &inarg;
 821        req->out.numargs = 1;
 822        if (fc->minor < 9)
 823                req->out.args[0].size = FUSE_COMPAT_ATTR_OUT_SIZE;
 824        else
 825                req->out.args[0].size = sizeof(outarg);
 826        req->out.args[0].value = &outarg;
 827        fuse_request_send(fc, req);
 828        err = req->out.h.error;
 829        fuse_put_request(fc, req);
 830        if (!err) {
 831                if ((inode->i_mode ^ outarg.attr.mode) & S_IFMT) {
 832                        make_bad_inode(inode);
 833                        err = -EIO;
 834                } else {
 835                        fuse_change_attributes(inode, &outarg.attr,
 836                                               attr_timeout(&outarg),
 837                                               attr_version);
 838                        if (stat)
 839                                fuse_fillattr(inode, &outarg.attr, stat);
 840                }
 841        }
 842        return err;
 843}
 844
 845int fuse_update_attributes(struct inode *inode, struct kstat *stat,
 846                           struct file *file, bool *refreshed)
 847{
 848        struct fuse_inode *fi = get_fuse_inode(inode);
 849        int err;
 850        bool r;
 851
 852        if (fi->i_time < get_jiffies_64()) {
 853                r = true;
 854                err = fuse_do_getattr(inode, stat, file);
 855        } else {
 856                r = false;
 857                err = 0;
 858                if (stat) {
 859                        generic_fillattr(inode, stat);
 860                        stat->mode = fi->orig_i_mode;
 861                }
 862        }
 863
 864        if (refreshed != NULL)
 865                *refreshed = r;
 866
 867        return err;
 868}
 869
 870int fuse_reverse_inval_entry(struct super_block *sb, u64 parent_nodeid,
 871                             u64 child_nodeid, struct qstr *name)
 872{
 873        int err = -ENOTDIR;
 874        struct inode *parent;
 875        struct dentry *dir;
 876        struct dentry *entry;
 877
 878        parent = ilookup5(sb, parent_nodeid, fuse_inode_eq, &parent_nodeid);
 879        if (!parent)
 880                return -ENOENT;
 881
 882        mutex_lock(&parent->i_mutex);
 883        if (!S_ISDIR(parent->i_mode))
 884                goto unlock;
 885
 886        err = -ENOENT;
 887        dir = d_find_alias(parent);
 888        if (!dir)
 889                goto unlock;
 890
 891        entry = d_lookup(dir, name);
 892        dput(dir);
 893        if (!entry)
 894                goto unlock;
 895
 896        fuse_invalidate_attr(parent);
 897        fuse_invalidate_entry(entry);
 898
 899        if (child_nodeid != 0 && entry->d_inode) {
 900                mutex_lock(&entry->d_inode->i_mutex);
 901                if (get_node_id(entry->d_inode) != child_nodeid) {
 902                        err = -ENOENT;
 903                        goto badentry;
 904                }
 905                if (d_mountpoint(entry)) {
 906                        err = -EBUSY;
 907                        goto badentry;
 908                }
 909                if (S_ISDIR(entry->d_inode->i_mode)) {
 910                        shrink_dcache_parent(entry);
 911                        if (!simple_empty(entry)) {
 912                                err = -ENOTEMPTY;
 913                                goto badentry;
 914                        }
 915                        entry->d_inode->i_flags |= S_DEAD;
 916                }
 917                dont_mount(entry);
 918                clear_nlink(entry->d_inode);
 919                err = 0;
 920 badentry:
 921                mutex_unlock(&entry->d_inode->i_mutex);
 922                if (!err)
 923                        d_delete(entry);
 924        } else {
 925                err = 0;
 926        }
 927        dput(entry);
 928
 929 unlock:
 930        mutex_unlock(&parent->i_mutex);
 931        iput(parent);
 932        return err;
 933}
 934
 935/*
 936 * Calling into a user-controlled filesystem gives the filesystem
 937 * daemon ptrace-like capabilities over the requester process.  This
 938 * means, that the filesystem daemon is able to record the exact
 939 * filesystem operations performed, and can also control the behavior
 940 * of the requester process in otherwise impossible ways.  For example
 941 * it can delay the operation for arbitrary length of time allowing
 942 * DoS against the requester.
 943 *
 944 * For this reason only those processes can call into the filesystem,
 945 * for which the owner of the mount has ptrace privilege.  This
 946 * excludes processes started by other users, suid or sgid processes.
 947 */
 948int fuse_allow_task(struct fuse_conn *fc, struct task_struct *task)
 949{
 950        const struct cred *cred;
 951        int ret;
 952
 953        if (fc->flags & FUSE_ALLOW_OTHER)
 954                return 1;
 955
 956        rcu_read_lock();
 957        ret = 0;
 958        cred = __task_cred(task);
 959        if (cred->euid == fc->user_id &&
 960            cred->suid == fc->user_id &&
 961            cred->uid  == fc->user_id &&
 962            cred->egid == fc->group_id &&
 963            cred->sgid == fc->group_id &&
 964            cred->gid  == fc->group_id)
 965                ret = 1;
 966        rcu_read_unlock();
 967
 968        return ret;
 969}
 970
 971static int fuse_access(struct inode *inode, int mask)
 972{
 973        struct fuse_conn *fc = get_fuse_conn(inode);
 974        struct fuse_req *req;
 975        struct fuse_access_in inarg;
 976        int err;
 977
 978        if (fc->no_access)
 979                return 0;
 980
 981        req = fuse_get_req(fc);
 982        if (IS_ERR(req))
 983                return PTR_ERR(req);
 984
 985        memset(&inarg, 0, sizeof(inarg));
 986        inarg.mask = mask & (MAY_READ | MAY_WRITE | MAY_EXEC);
 987        req->in.h.opcode = FUSE_ACCESS;
 988        req->in.h.nodeid = get_node_id(inode);
 989        req->in.numargs = 1;
 990        req->in.args[0].size = sizeof(inarg);
 991        req->in.args[0].value = &inarg;
 992        fuse_request_send(fc, req);
 993        err = req->out.h.error;
 994        fuse_put_request(fc, req);
 995        if (err == -ENOSYS) {
 996                fc->no_access = 1;
 997                err = 0;
 998        }
 999        return err;
1000}
1001
1002static int fuse_perm_getattr(struct inode *inode, int mask)
1003{
1004        if (mask & MAY_NOT_BLOCK)
1005                return -ECHILD;
1006
1007        return fuse_do_getattr(inode, NULL, NULL);
1008}
1009
1010/*
1011 * Check permission.  The two basic access models of FUSE are:
1012 *
1013 * 1) Local access checking ('default_permissions' mount option) based
1014 * on file mode.  This is the plain old disk filesystem permission
1015 * modell.
1016 *
1017 * 2) "Remote" access checking, where server is responsible for
1018 * checking permission in each inode operation.  An exception to this
1019 * is if ->permission() was invoked from sys_access() in which case an
1020 * access request is sent.  Execute permission is still checked
1021 * locally based on file mode.
1022 */
1023static int fuse_permission(struct inode *inode, int mask)
1024{
1025        struct fuse_conn *fc = get_fuse_conn(inode);
1026        bool refreshed = false;
1027        int err = 0;
1028
1029        if (!fuse_allow_task(fc, current))
1030                return -EACCES;
1031
1032        /*
1033         * If attributes are needed, refresh them before proceeding
1034         */
1035        if ((fc->flags & FUSE_DEFAULT_PERMISSIONS) ||
1036            ((mask & MAY_EXEC) && S_ISREG(inode->i_mode))) {
1037                struct fuse_inode *fi = get_fuse_inode(inode);
1038
1039                if (fi->i_time < get_jiffies_64()) {
1040                        refreshed = true;
1041
1042                        err = fuse_perm_getattr(inode, mask);
1043                        if (err)
1044                                return err;
1045                }
1046        }
1047
1048        if (fc->flags & FUSE_DEFAULT_PERMISSIONS) {
1049                err = generic_permission(inode, mask);
1050
1051                /* If permission is denied, try to refresh file
1052                   attributes.  This is also needed, because the root
1053                   node will at first have no permissions */
1054                if (err == -EACCES && !refreshed) {
1055                        err = fuse_perm_getattr(inode, mask);
1056                        if (!err)
1057                                err = generic_permission(inode, mask);
1058                }
1059
1060                /* Note: the opposite of the above test does not
1061                   exist.  So if permissions are revoked this won't be
1062                   noticed immediately, only after the attribute
1063                   timeout has expired */
1064        } else if (mask & (MAY_ACCESS | MAY_CHDIR)) {
1065                if (mask & MAY_NOT_BLOCK)
1066                        return -ECHILD;
1067
1068                err = fuse_access(inode, mask);
1069        } else if ((mask & MAY_EXEC) && S_ISREG(inode->i_mode)) {
1070                if (!(inode->i_mode & S_IXUGO)) {
1071                        if (refreshed)
1072                                return -EACCES;
1073
1074                        err = fuse_perm_getattr(inode, mask);
1075                        if (!err && !(inode->i_mode & S_IXUGO))
1076                                return -EACCES;
1077                }
1078        }
1079        return err;
1080}
1081
1082static int parse_dirfile(char *buf, size_t nbytes, struct file *file,
1083                         void *dstbuf, filldir_t filldir)
1084{
1085        while (nbytes >= FUSE_NAME_OFFSET) {
1086                struct fuse_dirent *dirent = (struct fuse_dirent *) buf;
1087                size_t reclen = FUSE_DIRENT_SIZE(dirent);
1088                int over;
1089                if (!dirent->namelen || dirent->namelen > FUSE_NAME_MAX)
1090                        return -EIO;
1091                if (reclen > nbytes)
1092                        break;
1093
1094                over = filldir(dstbuf, dirent->name, dirent->namelen,
1095                               file->f_pos, dirent->ino, dirent->type);
1096                if (over)
1097                        break;
1098
1099                buf += reclen;
1100                nbytes -= reclen;
1101                file->f_pos = dirent->off;
1102        }
1103
1104        return 0;
1105}
1106
1107static int fuse_readdir(struct file *file, void *dstbuf, filldir_t filldir)
1108{
1109        int err;
1110        size_t nbytes;
1111        struct page *page;
1112        struct inode *inode = file->f_path.dentry->d_inode;
1113        struct fuse_conn *fc = get_fuse_conn(inode);
1114        struct fuse_req *req;
1115
1116        if (is_bad_inode(inode))
1117                return -EIO;
1118
1119        req = fuse_get_req(fc);
1120        if (IS_ERR(req))
1121                return PTR_ERR(req);
1122
1123        page = alloc_page(GFP_KERNEL);
1124        if (!page) {
1125                fuse_put_request(fc, req);
1126                return -ENOMEM;
1127        }
1128        req->out.argpages = 1;
1129        req->num_pages = 1;
1130        req->pages[0] = page;
1131        fuse_read_fill(req, file, file->f_pos, PAGE_SIZE, FUSE_READDIR);
1132        fuse_request_send(fc, req);
1133        nbytes = req->out.args[0].size;
1134        err = req->out.h.error;
1135        fuse_put_request(fc, req);
1136        if (!err)
1137                err = parse_dirfile(page_address(page), nbytes, file, dstbuf,
1138                                    filldir);
1139
1140        __free_page(page);
1141        fuse_invalidate_attr(inode); /* atime changed */
1142        return err;
1143}
1144
1145static char *read_link(struct dentry *dentry)
1146{
1147        struct inode *inode = dentry->d_inode;
1148        struct fuse_conn *fc = get_fuse_conn(inode);
1149        struct fuse_req *req = fuse_get_req(fc);
1150        char *link;
1151
1152        if (IS_ERR(req))
1153                return ERR_CAST(req);
1154
1155        link = (char *) __get_free_page(GFP_KERNEL);
1156        if (!link) {
1157                link = ERR_PTR(-ENOMEM);
1158                goto out;
1159        }
1160        req->in.h.opcode = FUSE_READLINK;
1161        req->in.h.nodeid = get_node_id(inode);
1162        req->out.argvar = 1;
1163        req->out.numargs = 1;
1164        req->out.args[0].size = PAGE_SIZE - 1;
1165        req->out.args[0].value = link;
1166        fuse_request_send(fc, req);
1167        if (req->out.h.error) {
1168                free_page((unsigned long) link);
1169                link = ERR_PTR(req->out.h.error);
1170        } else
1171                link[req->out.args[0].size] = '\0';
1172 out:
1173        fuse_put_request(fc, req);
1174        fuse_invalidate_attr(inode); /* atime changed */
1175        return link;
1176}
1177
1178static void free_link(char *link)
1179{
1180        if (!IS_ERR(link))
1181                free_page((unsigned long) link);
1182}
1183
1184static void *fuse_follow_link(struct dentry *dentry, struct nameidata *nd)
1185{
1186        nd_set_link(nd, read_link(dentry));
1187        return NULL;
1188}
1189
1190static void fuse_put_link(struct dentry *dentry, struct nameidata *nd, void *c)
1191{
1192        free_link(nd_get_link(nd));
1193}
1194
1195static int fuse_dir_open(struct inode *inode, struct file *file)
1196{
1197        return fuse_open_common(inode, file, true);
1198}
1199
1200static int fuse_dir_release(struct inode *inode, struct file *file)
1201{
1202        fuse_release_common(file, FUSE_RELEASEDIR);
1203
1204        return 0;
1205}
1206
1207static int fuse_dir_fsync(struct file *file, loff_t start, loff_t end,
1208                          int datasync)
1209{
1210        return fuse_fsync_common(file, start, end, datasync, 1);
1211}
1212
1213static long fuse_dir_ioctl(struct file *file, unsigned int cmd,
1214                            unsigned long arg)
1215{
1216        struct fuse_conn *fc = get_fuse_conn(file->f_mapping->host);
1217
1218        /* FUSE_IOCTL_DIR only supported for API version >= 7.18 */
1219        if (fc->minor < 18)
1220                return -ENOTTY;
1221
1222        return fuse_ioctl_common(file, cmd, arg, FUSE_IOCTL_DIR);
1223}
1224
1225static long fuse_dir_compat_ioctl(struct file *file, unsigned int cmd,
1226                                   unsigned long arg)
1227{
1228        struct fuse_conn *fc = get_fuse_conn(file->f_mapping->host);
1229
1230        if (fc->minor < 18)
1231                return -ENOTTY;
1232
1233        return fuse_ioctl_common(file, cmd, arg,
1234                                 FUSE_IOCTL_COMPAT | FUSE_IOCTL_DIR);
1235}
1236
1237static bool update_mtime(unsigned ivalid)
1238{
1239        /* Always update if mtime is explicitly set  */
1240        if (ivalid & ATTR_MTIME_SET)
1241                return true;
1242
1243        /* If it's an open(O_TRUNC) or an ftruncate(), don't update */
1244        if ((ivalid & ATTR_SIZE) && (ivalid & (ATTR_OPEN | ATTR_FILE)))
1245                return false;
1246
1247        /* In all other cases update */
1248        return true;
1249}
1250
1251static void iattr_to_fattr(struct iattr *iattr, struct fuse_setattr_in *arg)
1252{
1253        unsigned ivalid = iattr->ia_valid;
1254
1255        if (ivalid & ATTR_MODE)
1256                arg->valid |= FATTR_MODE,   arg->mode = iattr->ia_mode;
1257        if (ivalid & ATTR_UID)
1258                arg->valid |= FATTR_UID,    arg->uid = iattr->ia_uid;
1259        if (ivalid & ATTR_GID)
1260                arg->valid |= FATTR_GID,    arg->gid = iattr->ia_gid;
1261        if (ivalid & ATTR_SIZE)
1262                arg->valid |= FATTR_SIZE,   arg->size = iattr->ia_size;
1263        if (ivalid & ATTR_ATIME) {
1264                arg->valid |= FATTR_ATIME;
1265                arg->atime = iattr->ia_atime.tv_sec;
1266                arg->atimensec = iattr->ia_atime.tv_nsec;
1267                if (!(ivalid & ATTR_ATIME_SET))
1268                        arg->valid |= FATTR_ATIME_NOW;
1269        }
1270        if ((ivalid & ATTR_MTIME) && update_mtime(ivalid)) {
1271                arg->valid |= FATTR_MTIME;
1272                arg->mtime = iattr->ia_mtime.tv_sec;
1273                arg->mtimensec = iattr->ia_mtime.tv_nsec;
1274                if (!(ivalid & ATTR_MTIME_SET))
1275                        arg->valid |= FATTR_MTIME_NOW;
1276        }
1277}
1278
1279/*
1280 * Prevent concurrent writepages on inode
1281 *
1282 * This is done by adding a negative bias to the inode write counter
1283 * and waiting for all pending writes to finish.
1284 */
1285void fuse_set_nowrite(struct inode *inode)
1286{
1287        struct fuse_conn *fc = get_fuse_conn(inode);
1288        struct fuse_inode *fi = get_fuse_inode(inode);
1289
1290        BUG_ON(!mutex_is_locked(&inode->i_mutex));
1291
1292        spin_lock(&fc->lock);
1293        BUG_ON(fi->writectr < 0);
1294        fi->writectr += FUSE_NOWRITE;
1295        spin_unlock(&fc->lock);
1296        wait_event(fi->page_waitq, fi->writectr == FUSE_NOWRITE);
1297}
1298
1299/*
1300 * Allow writepages on inode
1301 *
1302 * Remove the bias from the writecounter and send any queued
1303 * writepages.
1304 */
1305static void __fuse_release_nowrite(struct inode *inode)
1306{
1307        struct fuse_inode *fi = get_fuse_inode(inode);
1308
1309        BUG_ON(fi->writectr != FUSE_NOWRITE);
1310        fi->writectr = 0;
1311        fuse_flush_writepages(inode);
1312}
1313
1314void fuse_release_nowrite(struct inode *inode)
1315{
1316        struct fuse_conn *fc = get_fuse_conn(inode);
1317
1318        spin_lock(&fc->lock);
1319        __fuse_release_nowrite(inode);
1320        spin_unlock(&fc->lock);
1321}
1322
1323/*
1324 * Set attributes, and at the same time refresh them.
1325 *
1326 * Truncation is slightly complicated, because the 'truncate' request
1327 * may fail, in which case we don't want to touch the mapping.
1328 * vmtruncate() doesn't allow for this case, so do the rlimit checking
1329 * and the actual truncation by hand.
1330 */
1331static int fuse_do_setattr(struct dentry *entry, struct iattr *attr,
1332                           struct file *file)
1333{
1334        struct inode *inode = entry->d_inode;
1335        struct fuse_conn *fc = get_fuse_conn(inode);
1336        struct fuse_req *req;
1337        struct fuse_setattr_in inarg;
1338        struct fuse_attr_out outarg;
1339        bool is_truncate = false;
1340        loff_t oldsize;
1341        int err;
1342
1343        if (!fuse_allow_task(fc, current))
1344                return -EACCES;
1345
1346        if (!(fc->flags & FUSE_DEFAULT_PERMISSIONS))
1347                attr->ia_valid |= ATTR_FORCE;
1348
1349        err = inode_change_ok(inode, attr);
1350        if (err)
1351                return err;
1352
1353        if (attr->ia_valid & ATTR_OPEN) {
1354                if (fc->atomic_o_trunc)
1355                        return 0;
1356                file = NULL;
1357        }
1358
1359        if (attr->ia_valid & ATTR_SIZE)
1360                is_truncate = true;
1361
1362        req = fuse_get_req(fc);
1363        if (IS_ERR(req))
1364                return PTR_ERR(req);
1365
1366        if (is_truncate)
1367                fuse_set_nowrite(inode);
1368
1369        memset(&inarg, 0, sizeof(inarg));
1370        memset(&outarg, 0, sizeof(outarg));
1371        iattr_to_fattr(attr, &inarg);
1372        if (file) {
1373                struct fuse_file *ff = file->private_data;
1374                inarg.valid |= FATTR_FH;
1375                inarg.fh = ff->fh;
1376        }
1377        if (attr->ia_valid & ATTR_SIZE) {
1378                /* For mandatory locking in truncate */
1379                inarg.valid |= FATTR_LOCKOWNER;
1380                inarg.lock_owner = fuse_lock_owner_id(fc, current->files);
1381        }
1382        req->in.h.opcode = FUSE_SETATTR;
1383        req->in.h.nodeid = get_node_id(inode);
1384        req->in.numargs = 1;
1385        req->in.args[0].size = sizeof(inarg);
1386        req->in.args[0].value = &inarg;
1387        req->out.numargs = 1;
1388        if (fc->minor < 9)
1389                req->out.args[0].size = FUSE_COMPAT_ATTR_OUT_SIZE;
1390        else
1391                req->out.args[0].size = sizeof(outarg);
1392        req->out.args[0].value = &outarg;
1393        fuse_request_send(fc, req);
1394        err = req->out.h.error;
1395        fuse_put_request(fc, req);
1396        if (err) {
1397                if (err == -EINTR)
1398                        fuse_invalidate_attr(inode);
1399                goto error;
1400        }
1401
1402        if ((inode->i_mode ^ outarg.attr.mode) & S_IFMT) {
1403                make_bad_inode(inode);
1404                err = -EIO;
1405                goto error;
1406        }
1407
1408        spin_lock(&fc->lock);
1409        fuse_change_attributes_common(inode, &outarg.attr,
1410                                      attr_timeout(&outarg));
1411        oldsize = inode->i_size;
1412        i_size_write(inode, outarg.attr.size);
1413
1414        if (is_truncate) {
1415                /* NOTE: this may release/reacquire fc->lock */
1416                __fuse_release_nowrite(inode);
1417        }
1418        spin_unlock(&fc->lock);
1419
1420        /*
1421         * Only call invalidate_inode_pages2() after removing
1422         * FUSE_NOWRITE, otherwise fuse_launder_page() would deadlock.
1423         */
1424        if (S_ISREG(inode->i_mode) && oldsize != outarg.attr.size) {
1425                truncate_pagecache(inode, oldsize, outarg.attr.size);
1426                invalidate_inode_pages2(inode->i_mapping);
1427        }
1428
1429        return 0;
1430
1431error:
1432        if (is_truncate)
1433                fuse_release_nowrite(inode);
1434
1435        return err;
1436}
1437
1438static int fuse_setattr(struct dentry *entry, struct iattr *attr)
1439{
1440        if (attr->ia_valid & ATTR_FILE)
1441                return fuse_do_setattr(entry, attr, attr->ia_file);
1442        else
1443                return fuse_do_setattr(entry, attr, NULL);
1444}
1445
1446static int fuse_getattr(struct vfsmount *mnt, struct dentry *entry,
1447                        struct kstat *stat)
1448{
1449        struct inode *inode = entry->d_inode;
1450        struct fuse_conn *fc = get_fuse_conn(inode);
1451
1452        if (!fuse_allow_task(fc, current))
1453                return -EACCES;
1454
1455        return fuse_update_attributes(inode, stat, NULL, NULL);
1456}
1457
1458static int fuse_setxattr(struct dentry *entry, const char *name,
1459                         const void *value, size_t size, int flags)
1460{
1461        struct inode *inode = entry->d_inode;
1462        struct fuse_conn *fc = get_fuse_conn(inode);
1463        struct fuse_req *req;
1464        struct fuse_setxattr_in inarg;
1465        int err;
1466
1467        if (fc->no_setxattr)
1468                return -EOPNOTSUPP;
1469
1470        req = fuse_get_req(fc);
1471        if (IS_ERR(req))
1472                return PTR_ERR(req);
1473
1474        memset(&inarg, 0, sizeof(inarg));
1475        inarg.size = size;
1476        inarg.flags = flags;
1477        req->in.h.opcode = FUSE_SETXATTR;
1478        req->in.h.nodeid = get_node_id(inode);
1479        req->in.numargs = 3;
1480        req->in.args[0].size = sizeof(inarg);
1481        req->in.args[0].value = &inarg;
1482        req->in.args[1].size = strlen(name) + 1;
1483        req->in.args[1].value = name;
1484        req->in.args[2].size = size;
1485        req->in.args[2].value = value;
1486        fuse_request_send(fc, req);
1487        err = req->out.h.error;
1488        fuse_put_request(fc, req);
1489        if (err == -ENOSYS) {
1490                fc->no_setxattr = 1;
1491                err = -EOPNOTSUPP;
1492        }
1493        return err;
1494}
1495
1496static ssize_t fuse_getxattr(struct dentry *entry, const char *name,
1497                             void *value, size_t size)
1498{
1499        struct inode *inode = entry->d_inode;
1500        struct fuse_conn *fc = get_fuse_conn(inode);
1501        struct fuse_req *req;
1502        struct fuse_getxattr_in inarg;
1503        struct fuse_getxattr_out outarg;
1504        ssize_t ret;
1505
1506        if (fc->no_getxattr)
1507                return -EOPNOTSUPP;
1508
1509        req = fuse_get_req(fc);
1510        if (IS_ERR(req))
1511                return PTR_ERR(req);
1512
1513        memset(&inarg, 0, sizeof(inarg));
1514        inarg.size = size;
1515        req->in.h.opcode = FUSE_GETXATTR;
1516        req->in.h.nodeid = get_node_id(inode);
1517        req->in.numargs = 2;
1518        req->in.args[0].size = sizeof(inarg);
1519        req->in.args[0].value = &inarg;
1520        req->in.args[1].size = strlen(name) + 1;
1521        req->in.args[1].value = name;
1522        /* This is really two different operations rolled into one */
1523        req->out.numargs = 1;
1524        if (size) {
1525                req->out.argvar = 1;
1526                req->out.args[0].size = size;
1527                req->out.args[0].value = value;
1528        } else {
1529                req->out.args[0].size = sizeof(outarg);
1530                req->out.args[0].value = &outarg;
1531        }
1532        fuse_request_send(fc, req);
1533        ret = req->out.h.error;
1534        if (!ret)
1535                ret = size ? req->out.args[0].size : outarg.size;
1536        else {
1537                if (ret == -ENOSYS) {
1538                        fc->no_getxattr = 1;
1539                        ret = -EOPNOTSUPP;
1540                }
1541        }
1542        fuse_put_request(fc, req);
1543        return ret;
1544}
1545
1546static ssize_t fuse_listxattr(struct dentry *entry, char *list, size_t size)
1547{
1548        struct inode *inode = entry->d_inode;
1549        struct fuse_conn *fc = get_fuse_conn(inode);
1550        struct fuse_req *req;
1551        struct fuse_getxattr_in inarg;
1552        struct fuse_getxattr_out outarg;
1553        ssize_t ret;
1554
1555        if (!fuse_allow_task(fc, current))
1556                return -EACCES;
1557
1558        if (fc->no_listxattr)
1559                return -EOPNOTSUPP;
1560
1561        req = fuse_get_req(fc);
1562        if (IS_ERR(req))
1563                return PTR_ERR(req);
1564
1565        memset(&inarg, 0, sizeof(inarg));
1566        inarg.size = size;
1567        req->in.h.opcode = FUSE_LISTXATTR;
1568        req->in.h.nodeid = get_node_id(inode);
1569        req->in.numargs = 1;
1570        req->in.args[0].size = sizeof(inarg);
1571        req->in.args[0].value = &inarg;
1572        /* This is really two different operations rolled into one */
1573        req->out.numargs = 1;
1574        if (size) {
1575                req->out.argvar = 1;
1576                req->out.args[0].size = size;
1577                req->out.args[0].value = list;
1578        } else {
1579                req->out.args[0].size = sizeof(outarg);
1580                req->out.args[0].value = &outarg;
1581        }
1582        fuse_request_send(fc, req);
1583        ret = req->out.h.error;
1584        if (!ret)
1585                ret = size ? req->out.args[0].size : outarg.size;
1586        else {
1587                if (ret == -ENOSYS) {
1588                        fc->no_listxattr = 1;
1589                        ret = -EOPNOTSUPP;
1590                }
1591        }
1592        fuse_put_request(fc, req);
1593        return ret;
1594}
1595
1596static int fuse_removexattr(struct dentry *entry, const char *name)
1597{
1598        struct inode *inode = entry->d_inode;
1599        struct fuse_conn *fc = get_fuse_conn(inode);
1600        struct fuse_req *req;
1601        int err;
1602
1603        if (fc->no_removexattr)
1604                return -EOPNOTSUPP;
1605
1606        req = fuse_get_req(fc);
1607        if (IS_ERR(req))
1608                return PTR_ERR(req);
1609
1610        req->in.h.opcode = FUSE_REMOVEXATTR;
1611        req->in.h.nodeid = get_node_id(inode);
1612        req->in.numargs = 1;
1613        req->in.args[0].size = strlen(name) + 1;
1614        req->in.args[0].value = name;
1615        fuse_request_send(fc, req);
1616        err = req->out.h.error;
1617        fuse_put_request(fc, req);
1618        if (err == -ENOSYS) {
1619                fc->no_removexattr = 1;
1620                err = -EOPNOTSUPP;
1621        }
1622        return err;
1623}
1624
1625static const struct inode_operations fuse_dir_inode_operations = {
1626        .lookup         = fuse_lookup,
1627        .mkdir          = fuse_mkdir,
1628        .symlink        = fuse_symlink,
1629        .unlink         = fuse_unlink,
1630        .rmdir          = fuse_rmdir,
1631        .rename         = fuse_rename,
1632        .link           = fuse_link,
1633        .setattr        = fuse_setattr,
1634        .create         = fuse_create,
1635        .mknod          = fuse_mknod,
1636        .permission     = fuse_permission,
1637        .getattr        = fuse_getattr,
1638        .setxattr       = fuse_setxattr,
1639        .getxattr       = fuse_getxattr,
1640        .listxattr      = fuse_listxattr,
1641        .removexattr    = fuse_removexattr,
1642};
1643
1644static const struct file_operations fuse_dir_operations = {
1645        .llseek         = generic_file_llseek,
1646        .read           = generic_read_dir,
1647        .readdir        = fuse_readdir,
1648        .open           = fuse_dir_open,
1649        .release        = fuse_dir_release,
1650        .fsync          = fuse_dir_fsync,
1651        .unlocked_ioctl = fuse_dir_ioctl,
1652        .compat_ioctl   = fuse_dir_compat_ioctl,
1653};
1654
1655static const struct inode_operations fuse_common_inode_operations = {
1656        .setattr        = fuse_setattr,
1657        .permission     = fuse_permission,
1658        .getattr        = fuse_getattr,
1659        .setxattr       = fuse_setxattr,
1660        .getxattr       = fuse_getxattr,
1661        .listxattr      = fuse_listxattr,
1662        .removexattr    = fuse_removexattr,
1663};
1664
1665static const struct inode_operations fuse_symlink_inode_operations = {
1666        .setattr        = fuse_setattr,
1667        .follow_link    = fuse_follow_link,
1668        .put_link       = fuse_put_link,
1669        .readlink       = generic_readlink,
1670        .getattr        = fuse_getattr,
1671        .setxattr       = fuse_setxattr,
1672        .getxattr       = fuse_getxattr,
1673        .listxattr      = fuse_listxattr,
1674        .removexattr    = fuse_removexattr,
1675};
1676
1677void fuse_init_common(struct inode *inode)
1678{
1679        inode->i_op = &fuse_common_inode_operations;
1680}
1681
1682void fuse_init_dir(struct inode *inode)
1683{
1684        inode->i_op = &fuse_dir_inode_operations;
1685        inode->i_fop = &fuse_dir_operations;
1686}
1687
1688void fuse_init_symlink(struct inode *inode)
1689{
1690        inode->i_op = &fuse_symlink_inode_operations;
1691}
1692
lxr.linux.no kindly hosted by Redpill Linpro AS, provider of Linux consulting and operations services since 1995.