linux/fs/ceph/inode.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0
   2#include <linux/ceph/ceph_debug.h>
   3
   4#include <linux/module.h>
   5#include <linux/fs.h>
   6#include <linux/slab.h>
   7#include <linux/string.h>
   8#include <linux/uaccess.h>
   9#include <linux/kernel.h>
  10#include <linux/writeback.h>
  11#include <linux/vmalloc.h>
  12#include <linux/xattr.h>
  13#include <linux/posix_acl.h>
  14#include <linux/random.h>
  15#include <linux/sort.h>
  16
  17#include "super.h"
  18#include "mds_client.h"
  19#include "cache.h"
  20#include <linux/ceph/decode.h>
  21
  22/*
  23 * Ceph inode operations
  24 *
  25 * Implement basic inode helpers (get, alloc) and inode ops (getattr,
  26 * setattr, etc.), xattr helpers, and helpers for assimilating
  27 * metadata returned by the MDS into our cache.
  28 *
  29 * Also define helpers for doing asynchronous writeback, invalidation,
  30 * and truncation for the benefit of those who can't afford to block
  31 * (typically because they are in the message handler path).
  32 */
  33
  34static const struct inode_operations ceph_symlink_iops;
  35
  36static void ceph_invalidate_work(struct work_struct *work);
  37static void ceph_writeback_work(struct work_struct *work);
  38static void ceph_vmtruncate_work(struct work_struct *work);
  39
  40/*
  41 * find or create an inode, given the ceph ino number
  42 */
  43static int ceph_set_ino_cb(struct inode *inode, void *data)
  44{
  45        ceph_inode(inode)->i_vino = *(struct ceph_vino *)data;
  46        inode->i_ino = ceph_vino_to_ino(*(struct ceph_vino *)data);
  47        return 0;
  48}
  49
  50struct inode *ceph_get_inode(struct super_block *sb, struct ceph_vino vino)
  51{
  52        struct inode *inode;
  53        ino_t t = ceph_vino_to_ino(vino);
  54
  55        inode = iget5_locked(sb, t, ceph_ino_compare, ceph_set_ino_cb, &vino);
  56        if (!inode)
  57                return ERR_PTR(-ENOMEM);
  58        if (inode->i_state & I_NEW) {
  59                dout("get_inode created new inode %p %llx.%llx ino %llx\n",
  60                     inode, ceph_vinop(inode), (u64)inode->i_ino);
  61                unlock_new_inode(inode);
  62        }
  63
  64        dout("get_inode on %lu=%llx.%llx got %p\n", inode->i_ino, vino.ino,
  65             vino.snap, inode);
  66        return inode;
  67}
  68
  69/*
  70 * get/constuct snapdir inode for a given directory
  71 */
  72struct inode *ceph_get_snapdir(struct inode *parent)
  73{
  74        struct ceph_vino vino = {
  75                .ino = ceph_ino(parent),
  76                .snap = CEPH_SNAPDIR,
  77        };
  78        struct inode *inode = ceph_get_inode(parent->i_sb, vino);
  79        struct ceph_inode_info *ci = ceph_inode(inode);
  80
  81        BUG_ON(!S_ISDIR(parent->i_mode));
  82        if (IS_ERR(inode))
  83                return inode;
  84        inode->i_mode = parent->i_mode;
  85        inode->i_uid = parent->i_uid;
  86        inode->i_gid = parent->i_gid;
  87        inode->i_op = &ceph_snapdir_iops;
  88        inode->i_fop = &ceph_snapdir_fops;
  89        ci->i_snap_caps = CEPH_CAP_PIN; /* so we can open */
  90        ci->i_rbytes = 0;
  91        return inode;
  92}
  93
  94const struct inode_operations ceph_file_iops = {
  95        .permission = ceph_permission,
  96        .setattr = ceph_setattr,
  97        .getattr = ceph_getattr,
  98        .listxattr = ceph_listxattr,
  99        .get_acl = ceph_get_acl,
 100        .set_acl = ceph_set_acl,
 101};
 102
 103
 104/*
 105 * We use a 'frag tree' to keep track of the MDS's directory fragments
 106 * for a given inode (usually there is just a single fragment).  We
 107 * need to know when a child frag is delegated to a new MDS, or when
 108 * it is flagged as replicated, so we can direct our requests
 109 * accordingly.
 110 */
 111
 112/*
 113 * find/create a frag in the tree
 114 */
 115static struct ceph_inode_frag *__get_or_create_frag(struct ceph_inode_info *ci,
 116                                                    u32 f)
 117{
 118        struct rb_node **p;
 119        struct rb_node *parent = NULL;
 120        struct ceph_inode_frag *frag;
 121        int c;
 122
 123        p = &ci->i_fragtree.rb_node;
 124        while (*p) {
 125                parent = *p;
 126                frag = rb_entry(parent, struct ceph_inode_frag, node);
 127                c = ceph_frag_compare(f, frag->frag);
 128                if (c < 0)
 129                        p = &(*p)->rb_left;
 130                else if (c > 0)
 131                        p = &(*p)->rb_right;
 132                else
 133                        return frag;
 134        }
 135
 136        frag = kmalloc(sizeof(*frag), GFP_NOFS);
 137        if (!frag)
 138                return ERR_PTR(-ENOMEM);
 139
 140        frag->frag = f;
 141        frag->split_by = 0;
 142        frag->mds = -1;
 143        frag->ndist = 0;
 144
 145        rb_link_node(&frag->node, parent, p);
 146        rb_insert_color(&frag->node, &ci->i_fragtree);
 147
 148        dout("get_or_create_frag added %llx.%llx frag %x\n",
 149             ceph_vinop(&ci->vfs_inode), f);
 150        return frag;
 151}
 152
 153/*
 154 * find a specific frag @f
 155 */
 156struct ceph_inode_frag *__ceph_find_frag(struct ceph_inode_info *ci, u32 f)
 157{
 158        struct rb_node *n = ci->i_fragtree.rb_node;
 159
 160        while (n) {
 161                struct ceph_inode_frag *frag =
 162                        rb_entry(n, struct ceph_inode_frag, node);
 163                int c = ceph_frag_compare(f, frag->frag);
 164                if (c < 0)
 165                        n = n->rb_left;
 166                else if (c > 0)
 167                        n = n->rb_right;
 168                else
 169                        return frag;
 170        }
 171        return NULL;
 172}
 173
 174/*
 175 * Choose frag containing the given value @v.  If @pfrag is
 176 * specified, copy the frag delegation info to the caller if
 177 * it is present.
 178 */
 179static u32 __ceph_choose_frag(struct ceph_inode_info *ci, u32 v,
 180                              struct ceph_inode_frag *pfrag, int *found)
 181{
 182        u32 t = ceph_frag_make(0, 0);
 183        struct ceph_inode_frag *frag;
 184        unsigned nway, i;
 185        u32 n;
 186
 187        if (found)
 188                *found = 0;
 189
 190        while (1) {
 191                WARN_ON(!ceph_frag_contains_value(t, v));
 192                frag = __ceph_find_frag(ci, t);
 193                if (!frag)
 194                        break; /* t is a leaf */
 195                if (frag->split_by == 0) {
 196                        if (pfrag)
 197                                memcpy(pfrag, frag, sizeof(*pfrag));
 198                        if (found)
 199                                *found = 1;
 200                        break;
 201                }
 202
 203                /* choose child */
 204                nway = 1 << frag->split_by;
 205                dout("choose_frag(%x) %x splits by %d (%d ways)\n", v, t,
 206                     frag->split_by, nway);
 207                for (i = 0; i < nway; i++) {
 208                        n = ceph_frag_make_child(t, frag->split_by, i);
 209                        if (ceph_frag_contains_value(n, v)) {
 210                                t = n;
 211                                break;
 212                        }
 213                }
 214                BUG_ON(i == nway);
 215        }
 216        dout("choose_frag(%x) = %x\n", v, t);
 217
 218        return t;
 219}
 220
 221u32 ceph_choose_frag(struct ceph_inode_info *ci, u32 v,
 222                     struct ceph_inode_frag *pfrag, int *found)
 223{
 224        u32 ret;
 225        mutex_lock(&ci->i_fragtree_mutex);
 226        ret = __ceph_choose_frag(ci, v, pfrag, found);
 227        mutex_unlock(&ci->i_fragtree_mutex);
 228        return ret;
 229}
 230
 231/*
 232 * Process dirfrag (delegation) info from the mds.  Include leaf
 233 * fragment in tree ONLY if ndist > 0.  Otherwise, only
 234 * branches/splits are included in i_fragtree)
 235 */
 236static int ceph_fill_dirfrag(struct inode *inode,
 237                             struct ceph_mds_reply_dirfrag *dirinfo)
 238{
 239        struct ceph_inode_info *ci = ceph_inode(inode);
 240        struct ceph_inode_frag *frag;
 241        u32 id = le32_to_cpu(dirinfo->frag);
 242        int mds = le32_to_cpu(dirinfo->auth);
 243        int ndist = le32_to_cpu(dirinfo->ndist);
 244        int diri_auth = -1;
 245        int i;
 246        int err = 0;
 247
 248        spin_lock(&ci->i_ceph_lock);
 249        if (ci->i_auth_cap)
 250                diri_auth = ci->i_auth_cap->mds;
 251        spin_unlock(&ci->i_ceph_lock);
 252
 253        if (mds == -1) /* CDIR_AUTH_PARENT */
 254                mds = diri_auth;
 255
 256        mutex_lock(&ci->i_fragtree_mutex);
 257        if (ndist == 0 && mds == diri_auth) {
 258                /* no delegation info needed. */
 259                frag = __ceph_find_frag(ci, id);
 260                if (!frag)
 261                        goto out;
 262                if (frag->split_by == 0) {
 263                        /* tree leaf, remove */
 264                        dout("fill_dirfrag removed %llx.%llx frag %x"
 265                             " (no ref)\n", ceph_vinop(inode), id);
 266                        rb_erase(&frag->node, &ci->i_fragtree);
 267                        kfree(frag);
 268                } else {
 269                        /* tree branch, keep and clear */
 270                        dout("fill_dirfrag cleared %llx.%llx frag %x"
 271                             " referral\n", ceph_vinop(inode), id);
 272                        frag->mds = -1;
 273                        frag->ndist = 0;
 274                }
 275                goto out;
 276        }
 277
 278
 279        /* find/add this frag to store mds delegation info */
 280        frag = __get_or_create_frag(ci, id);
 281        if (IS_ERR(frag)) {
 282                /* this is not the end of the world; we can continue
 283                   with bad/inaccurate delegation info */
 284                pr_err("fill_dirfrag ENOMEM on mds ref %llx.%llx fg %x\n",
 285                       ceph_vinop(inode), le32_to_cpu(dirinfo->frag));
 286                err = -ENOMEM;
 287                goto out;
 288        }
 289
 290        frag->mds = mds;
 291        frag->ndist = min_t(u32, ndist, CEPH_MAX_DIRFRAG_REP);
 292        for (i = 0; i < frag->ndist; i++)
 293                frag->dist[i] = le32_to_cpu(dirinfo->dist[i]);
 294        dout("fill_dirfrag %llx.%llx frag %x ndist=%d\n",
 295             ceph_vinop(inode), frag->frag, frag->ndist);
 296
 297out:
 298        mutex_unlock(&ci->i_fragtree_mutex);
 299        return err;
 300}
 301
 302static int frag_tree_split_cmp(const void *l, const void *r)
 303{
 304        struct ceph_frag_tree_split *ls = (struct ceph_frag_tree_split*)l;
 305        struct ceph_frag_tree_split *rs = (struct ceph_frag_tree_split*)r;
 306        return ceph_frag_compare(le32_to_cpu(ls->frag),
 307                                 le32_to_cpu(rs->frag));
 308}
 309
 310static bool is_frag_child(u32 f, struct ceph_inode_frag *frag)
 311{
 312        if (!frag)
 313                return f == ceph_frag_make(0, 0);
 314        if (ceph_frag_bits(f) != ceph_frag_bits(frag->frag) + frag->split_by)
 315                return false;
 316        return ceph_frag_contains_value(frag->frag, ceph_frag_value(f));
 317}
 318
 319static int ceph_fill_fragtree(struct inode *inode,
 320                              struct ceph_frag_tree_head *fragtree,
 321                              struct ceph_mds_reply_dirfrag *dirinfo)
 322{
 323        struct ceph_inode_info *ci = ceph_inode(inode);
 324        struct ceph_inode_frag *frag, *prev_frag = NULL;
 325        struct rb_node *rb_node;
 326        unsigned i, split_by, nsplits;
 327        u32 id;
 328        bool update = false;
 329
 330        mutex_lock(&ci->i_fragtree_mutex);
 331        nsplits = le32_to_cpu(fragtree->nsplits);
 332        if (nsplits != ci->i_fragtree_nsplits) {
 333                update = true;
 334        } else if (nsplits) {
 335                i = prandom_u32() % nsplits;
 336                id = le32_to_cpu(fragtree->splits[i].frag);
 337                if (!__ceph_find_frag(ci, id))
 338                        update = true;
 339        } else if (!RB_EMPTY_ROOT(&ci->i_fragtree)) {
 340                rb_node = rb_first(&ci->i_fragtree);
 341                frag = rb_entry(rb_node, struct ceph_inode_frag, node);
 342                if (frag->frag != ceph_frag_make(0, 0) || rb_next(rb_node))
 343                        update = true;
 344        }
 345        if (!update && dirinfo) {
 346                id = le32_to_cpu(dirinfo->frag);
 347                if (id != __ceph_choose_frag(ci, id, NULL, NULL))
 348                        update = true;
 349        }
 350        if (!update)
 351                goto out_unlock;
 352
 353        if (nsplits > 1) {
 354                sort(fragtree->splits, nsplits, sizeof(fragtree->splits[0]),
 355                     frag_tree_split_cmp, NULL);
 356        }
 357
 358        dout("fill_fragtree %llx.%llx\n", ceph_vinop(inode));
 359        rb_node = rb_first(&ci->i_fragtree);
 360        for (i = 0; i < nsplits; i++) {
 361                id = le32_to_cpu(fragtree->splits[i].frag);
 362                split_by = le32_to_cpu(fragtree->splits[i].by);
 363                if (split_by == 0 || ceph_frag_bits(id) + split_by > 24) {
 364                        pr_err("fill_fragtree %llx.%llx invalid split %d/%u, "
 365                               "frag %x split by %d\n", ceph_vinop(inode),
 366                               i, nsplits, id, split_by);
 367                        continue;
 368                }
 369                frag = NULL;
 370                while (rb_node) {
 371                        frag = rb_entry(rb_node, struct ceph_inode_frag, node);
 372                        if (ceph_frag_compare(frag->frag, id) >= 0) {
 373                                if (frag->frag != id)
 374                                        frag = NULL;
 375                                else
 376                                        rb_node = rb_next(rb_node);
 377                                break;
 378                        }
 379                        rb_node = rb_next(rb_node);
 380                        /* delete stale split/leaf node */
 381                        if (frag->split_by > 0 ||
 382                            !is_frag_child(frag->frag, prev_frag)) {
 383                                rb_erase(&frag->node, &ci->i_fragtree);
 384                                if (frag->split_by > 0)
 385                                        ci->i_fragtree_nsplits--;
 386                                kfree(frag);
 387                        }
 388                        frag = NULL;
 389                }
 390                if (!frag) {
 391                        frag = __get_or_create_frag(ci, id);
 392                        if (IS_ERR(frag))
 393                                continue;
 394                }
 395                if (frag->split_by == 0)
 396                        ci->i_fragtree_nsplits++;
 397                frag->split_by = split_by;
 398                dout(" frag %x split by %d\n", frag->frag, frag->split_by);
 399                prev_frag = frag;
 400        }
 401        while (rb_node) {
 402                frag = rb_entry(rb_node, struct ceph_inode_frag, node);
 403                rb_node = rb_next(rb_node);
 404                /* delete stale split/leaf node */
 405                if (frag->split_by > 0 ||
 406                    !is_frag_child(frag->frag, prev_frag)) {
 407                        rb_erase(&frag->node, &ci->i_fragtree);
 408                        if (frag->split_by > 0)
 409                                ci->i_fragtree_nsplits--;
 410                        kfree(frag);
 411                }
 412        }
 413out_unlock:
 414        mutex_unlock(&ci->i_fragtree_mutex);
 415        return 0;
 416}
 417
 418/*
 419 * initialize a newly allocated inode.
 420 */
 421struct inode *ceph_alloc_inode(struct super_block *sb)
 422{
 423        struct ceph_inode_info *ci;
 424        int i;
 425
 426        ci = kmem_cache_alloc(ceph_inode_cachep, GFP_NOFS);
 427        if (!ci)
 428                return NULL;
 429
 430        dout("alloc_inode %p\n", &ci->vfs_inode);
 431
 432        spin_lock_init(&ci->i_ceph_lock);
 433
 434        ci->i_version = 0;
 435        ci->i_inline_version = 0;
 436        ci->i_time_warp_seq = 0;
 437        ci->i_ceph_flags = 0;
 438        atomic64_set(&ci->i_ordered_count, 1);
 439        atomic64_set(&ci->i_release_count, 1);
 440        atomic64_set(&ci->i_complete_seq[0], 0);
 441        atomic64_set(&ci->i_complete_seq[1], 0);
 442        ci->i_symlink = NULL;
 443
 444        memset(&ci->i_dir_layout, 0, sizeof(ci->i_dir_layout));
 445        RCU_INIT_POINTER(ci->i_layout.pool_ns, NULL);
 446
 447        ci->i_fragtree = RB_ROOT;
 448        mutex_init(&ci->i_fragtree_mutex);
 449
 450        ci->i_xattrs.blob = NULL;
 451        ci->i_xattrs.prealloc_blob = NULL;
 452        ci->i_xattrs.dirty = false;
 453        ci->i_xattrs.index = RB_ROOT;
 454        ci->i_xattrs.count = 0;
 455        ci->i_xattrs.names_size = 0;
 456        ci->i_xattrs.vals_size = 0;
 457        ci->i_xattrs.version = 0;
 458        ci->i_xattrs.index_version = 0;
 459
 460        ci->i_caps = RB_ROOT;
 461        ci->i_auth_cap = NULL;
 462        ci->i_dirty_caps = 0;
 463        ci->i_flushing_caps = 0;
 464        INIT_LIST_HEAD(&ci->i_dirty_item);
 465        INIT_LIST_HEAD(&ci->i_flushing_item);
 466        ci->i_prealloc_cap_flush = NULL;
 467        INIT_LIST_HEAD(&ci->i_cap_flush_list);
 468        init_waitqueue_head(&ci->i_cap_wq);
 469        ci->i_hold_caps_min = 0;
 470        ci->i_hold_caps_max = 0;
 471        INIT_LIST_HEAD(&ci->i_cap_delay_list);
 472        INIT_LIST_HEAD(&ci->i_cap_snaps);
 473        ci->i_head_snapc = NULL;
 474        ci->i_snap_caps = 0;
 475
 476        for (i = 0; i < CEPH_FILE_MODE_BITS; i++)
 477                ci->i_nr_by_mode[i] = 0;
 478
 479        mutex_init(&ci->i_truncate_mutex);
 480        ci->i_truncate_seq = 0;
 481        ci->i_truncate_size = 0;
 482        ci->i_truncate_pending = 0;
 483
 484        ci->i_max_size = 0;
 485        ci->i_reported_size = 0;
 486        ci->i_wanted_max_size = 0;
 487        ci->i_requested_max_size = 0;
 488
 489        ci->i_pin_ref = 0;
 490        ci->i_rd_ref = 0;
 491        ci->i_rdcache_ref = 0;
 492        ci->i_wr_ref = 0;
 493        ci->i_wb_ref = 0;
 494        ci->i_wrbuffer_ref = 0;
 495        ci->i_wrbuffer_ref_head = 0;
 496        atomic_set(&ci->i_filelock_ref, 0);
 497        atomic_set(&ci->i_shared_gen, 0);
 498        ci->i_rdcache_gen = 0;
 499        ci->i_rdcache_revoking = 0;
 500
 501        INIT_LIST_HEAD(&ci->i_unsafe_dirops);
 502        INIT_LIST_HEAD(&ci->i_unsafe_iops);
 503        spin_lock_init(&ci->i_unsafe_lock);
 504
 505        ci->i_snap_realm = NULL;
 506        INIT_LIST_HEAD(&ci->i_snap_realm_item);
 507        INIT_LIST_HEAD(&ci->i_snap_flush_item);
 508
 509        INIT_WORK(&ci->i_wb_work, ceph_writeback_work);
 510        INIT_WORK(&ci->i_pg_inv_work, ceph_invalidate_work);
 511
 512        INIT_WORK(&ci->i_vmtruncate_work, ceph_vmtruncate_work);
 513
 514        ceph_fscache_inode_init(ci);
 515
 516        return &ci->vfs_inode;
 517}
 518
 519static void ceph_i_callback(struct rcu_head *head)
 520{
 521        struct inode *inode = container_of(head, struct inode, i_rcu);
 522        struct ceph_inode_info *ci = ceph_inode(inode);
 523
 524        kmem_cache_free(ceph_inode_cachep, ci);
 525}
 526
 527void ceph_destroy_inode(struct inode *inode)
 528{
 529        struct ceph_inode_info *ci = ceph_inode(inode);
 530        struct ceph_inode_frag *frag;
 531        struct rb_node *n;
 532
 533        dout("destroy_inode %p ino %llx.%llx\n", inode, ceph_vinop(inode));
 534
 535        ceph_fscache_unregister_inode_cookie(ci);
 536
 537        ceph_queue_caps_release(inode);
 538
 539        /*
 540         * we may still have a snap_realm reference if there are stray
 541         * caps in i_snap_caps.
 542         */
 543        if (ci->i_snap_realm) {
 544                struct ceph_mds_client *mdsc =
 545                        ceph_sb_to_client(ci->vfs_inode.i_sb)->mdsc;
 546                struct ceph_snap_realm *realm = ci->i_snap_realm;
 547
 548                dout(" dropping residual ref to snap realm %p\n", realm);
 549                spin_lock(&realm->inodes_with_caps_lock);
 550                list_del_init(&ci->i_snap_realm_item);
 551                spin_unlock(&realm->inodes_with_caps_lock);
 552                ceph_put_snap_realm(mdsc, realm);
 553        }
 554
 555        kfree(ci->i_symlink);
 556        while ((n = rb_first(&ci->i_fragtree)) != NULL) {
 557                frag = rb_entry(n, struct ceph_inode_frag, node);
 558                rb_erase(n, &ci->i_fragtree);
 559                kfree(frag);
 560        }
 561        ci->i_fragtree_nsplits = 0;
 562
 563        __ceph_destroy_xattrs(ci);
 564        if (ci->i_xattrs.blob)
 565                ceph_buffer_put(ci->i_xattrs.blob);
 566        if (ci->i_xattrs.prealloc_blob)
 567                ceph_buffer_put(ci->i_xattrs.prealloc_blob);
 568
 569        ceph_put_string(rcu_dereference_raw(ci->i_layout.pool_ns));
 570
 571        call_rcu(&inode->i_rcu, ceph_i_callback);
 572}
 573
 574int ceph_drop_inode(struct inode *inode)
 575{
 576        /*
 577         * Positve dentry and corresponding inode are always accompanied
 578         * in MDS reply. So no need to keep inode in the cache after
 579         * dropping all its aliases.
 580         */
 581        return 1;
 582}
 583
 584static inline blkcnt_t calc_inode_blocks(u64 size)
 585{
 586        return (size + (1<<9) - 1) >> 9;
 587}
 588
 589/*
 590 * Helpers to fill in size, ctime, mtime, and atime.  We have to be
 591 * careful because either the client or MDS may have more up to date
 592 * info, depending on which capabilities are held, and whether
 593 * time_warp_seq or truncate_seq have increased.  (Ordinarily, mtime
 594 * and size are monotonically increasing, except when utimes() or
 595 * truncate() increments the corresponding _seq values.)
 596 */
 597int ceph_fill_file_size(struct inode *inode, int issued,
 598                        u32 truncate_seq, u64 truncate_size, u64 size)
 599{
 600        struct ceph_inode_info *ci = ceph_inode(inode);
 601        int queue_trunc = 0;
 602
 603        if (ceph_seq_cmp(truncate_seq, ci->i_truncate_seq) > 0 ||
 604            (truncate_seq == ci->i_truncate_seq && size > inode->i_size)) {
 605                dout("size %lld -> %llu\n", inode->i_size, size);
 606                if (size > 0 && S_ISDIR(inode->i_mode)) {
 607                        pr_err("fill_file_size non-zero size for directory\n");
 608                        size = 0;
 609                }
 610                i_size_write(inode, size);
 611                inode->i_blocks = calc_inode_blocks(size);
 612                ci->i_reported_size = size;
 613                if (truncate_seq != ci->i_truncate_seq) {
 614                        dout("truncate_seq %u -> %u\n",
 615                             ci->i_truncate_seq, truncate_seq);
 616                        ci->i_truncate_seq = truncate_seq;
 617
 618                        /* the MDS should have revoked these caps */
 619                        WARN_ON_ONCE(issued & (CEPH_CAP_FILE_EXCL |
 620                                               CEPH_CAP_FILE_RD |
 621                                               CEPH_CAP_FILE_WR |
 622                                               CEPH_CAP_FILE_LAZYIO));
 623                        /*
 624                         * If we hold relevant caps, or in the case where we're
 625                         * not the only client referencing this file and we
 626                         * don't hold those caps, then we need to check whether
 627                         * the file is either opened or mmaped
 628                         */
 629                        if ((issued & (CEPH_CAP_FILE_CACHE|
 630                                       CEPH_CAP_FILE_BUFFER)) ||
 631                            mapping_mapped(inode->i_mapping) ||
 632                            __ceph_caps_file_wanted(ci)) {
 633                                ci->i_truncate_pending++;
 634                                queue_trunc = 1;
 635                        }
 636                }
 637        }
 638        if (ceph_seq_cmp(truncate_seq, ci->i_truncate_seq) >= 0 &&
 639            ci->i_truncate_size != truncate_size) {
 640                dout("truncate_size %lld -> %llu\n", ci->i_truncate_size,
 641                     truncate_size);
 642                ci->i_truncate_size = truncate_size;
 643        }
 644
 645        if (queue_trunc)
 646                ceph_fscache_invalidate(inode);
 647
 648        return queue_trunc;
 649}
 650
 651void ceph_fill_file_time(struct inode *inode, int issued,
 652                         u64 time_warp_seq, struct timespec *ctime,
 653                         struct timespec *mtime, struct timespec *atime)
 654{
 655        struct ceph_inode_info *ci = ceph_inode(inode);
 656        int warn = 0;
 657
 658        if (issued & (CEPH_CAP_FILE_EXCL|
 659                      CEPH_CAP_FILE_WR|
 660                      CEPH_CAP_FILE_BUFFER|
 661                      CEPH_CAP_AUTH_EXCL|
 662                      CEPH_CAP_XATTR_EXCL)) {
 663                if (timespec_compare(ctime, &inode->i_ctime) > 0) {
 664                        dout("ctime %ld.%09ld -> %ld.%09ld inc w/ cap\n",
 665                             inode->i_ctime.tv_sec, inode->i_ctime.tv_nsec,
 666                             ctime->tv_sec, ctime->tv_nsec);
 667                        inode->i_ctime = *ctime;
 668                }
 669                if (ceph_seq_cmp(time_warp_seq, ci->i_time_warp_seq) > 0) {
 670                        /* the MDS did a utimes() */
 671                        dout("mtime %ld.%09ld -> %ld.%09ld "
 672                             "tw %d -> %d\n",
 673                             inode->i_mtime.tv_sec, inode->i_mtime.tv_nsec,
 674                             mtime->tv_sec, mtime->tv_nsec,
 675                             ci->i_time_warp_seq, (int)time_warp_seq);
 676
 677                        inode->i_mtime = *mtime;
 678                        inode->i_atime = *atime;
 679                        ci->i_time_warp_seq = time_warp_seq;
 680                } else if (time_warp_seq == ci->i_time_warp_seq) {
 681                        /* nobody did utimes(); take the max */
 682                        if (timespec_compare(mtime, &inode->i_mtime) > 0) {
 683                                dout("mtime %ld.%09ld -> %ld.%09ld inc\n",
 684                                     inode->i_mtime.tv_sec,
 685                                     inode->i_mtime.tv_nsec,
 686                                     mtime->tv_sec, mtime->tv_nsec);
 687                                inode->i_mtime = *mtime;
 688                        }
 689                        if (timespec_compare(atime, &inode->i_atime) > 0) {
 690                                dout("atime %ld.%09ld -> %ld.%09ld inc\n",
 691                                     inode->i_atime.tv_sec,
 692                                     inode->i_atime.tv_nsec,
 693                                     atime->tv_sec, atime->tv_nsec);
 694                                inode->i_atime = *atime;
 695                        }
 696                } else if (issued & CEPH_CAP_FILE_EXCL) {
 697                        /* we did a utimes(); ignore mds values */
 698                } else {
 699                        warn = 1;
 700                }
 701        } else {
 702                /* we have no write|excl caps; whatever the MDS says is true */
 703                if (ceph_seq_cmp(time_warp_seq, ci->i_time_warp_seq) >= 0) {
 704                        inode->i_ctime = *ctime;
 705                        inode->i_mtime = *mtime;
 706                        inode->i_atime = *atime;
 707                        ci->i_time_warp_seq = time_warp_seq;
 708                } else {
 709                        warn = 1;
 710                }
 711        }
 712        if (warn) /* time_warp_seq shouldn't go backwards */
 713                dout("%p mds time_warp_seq %llu < %u\n",
 714                     inode, time_warp_seq, ci->i_time_warp_seq);
 715}
 716
 717/*
 718 * Populate an inode based on info from mds.  May be called on new or
 719 * existing inodes.
 720 */
 721static int fill_inode(struct inode *inode, struct page *locked_page,
 722                      struct ceph_mds_reply_info_in *iinfo,
 723                      struct ceph_mds_reply_dirfrag *dirinfo,
 724                      struct ceph_mds_session *session,
 725                      unsigned long ttl_from, int cap_fmode,
 726                      struct ceph_cap_reservation *caps_reservation)
 727{
 728        struct ceph_mds_client *mdsc = ceph_inode_to_client(inode)->mdsc;
 729        struct ceph_mds_reply_inode *info = iinfo->in;
 730        struct ceph_inode_info *ci = ceph_inode(inode);
 731        int issued = 0, implemented, new_issued;
 732        struct timespec mtime, atime, ctime;
 733        struct ceph_buffer *xattr_blob = NULL;
 734        struct ceph_string *pool_ns = NULL;
 735        struct ceph_cap *new_cap = NULL;
 736        int err = 0;
 737        bool wake = false;
 738        bool queue_trunc = false;
 739        bool new_version = false;
 740        bool fill_inline = false;
 741
 742        dout("fill_inode %p ino %llx.%llx v %llu had %llu\n",
 743             inode, ceph_vinop(inode), le64_to_cpu(info->version),
 744             ci->i_version);
 745
 746        /* prealloc new cap struct */
 747        if (info->cap.caps && ceph_snap(inode) == CEPH_NOSNAP)
 748                new_cap = ceph_get_cap(mdsc, caps_reservation);
 749
 750        /*
 751         * prealloc xattr data, if it looks like we'll need it.  only
 752         * if len > 4 (meaning there are actually xattrs; the first 4
 753         * bytes are the xattr count).
 754         */
 755        if (iinfo->xattr_len > 4) {
 756                xattr_blob = ceph_buffer_new(iinfo->xattr_len, GFP_NOFS);
 757                if (!xattr_blob)
 758                        pr_err("fill_inode ENOMEM xattr blob %d bytes\n",
 759                               iinfo->xattr_len);
 760        }
 761
 762        if (iinfo->pool_ns_len > 0)
 763                pool_ns = ceph_find_or_create_string(iinfo->pool_ns_data,
 764                                                     iinfo->pool_ns_len);
 765
 766        spin_lock(&ci->i_ceph_lock);
 767
 768        /*
 769         * provided version will be odd if inode value is projected,
 770         * even if stable.  skip the update if we have newer stable
 771         * info (ours>=theirs, e.g. due to racing mds replies), unless
 772         * we are getting projected (unstable) info (in which case the
 773         * version is odd, and we want ours>theirs).
 774         *   us   them
 775         *   2    2     skip
 776         *   3    2     skip
 777         *   3    3     update
 778         */
 779        if (ci->i_version == 0 ||
 780            ((info->cap.flags & CEPH_CAP_FLAG_AUTH) &&
 781             le64_to_cpu(info->version) > (ci->i_version & ~1)))
 782                new_version = true;
 783
 784        issued = __ceph_caps_issued(ci, &implemented);
 785        issued |= implemented | __ceph_caps_dirty(ci);
 786        new_issued = ~issued & le32_to_cpu(info->cap.caps);
 787
 788        /* update inode */
 789        ci->i_version = le64_to_cpu(info->version);
 790        inode->i_rdev = le32_to_cpu(info->rdev);
 791        inode->i_blkbits = fls(le32_to_cpu(info->layout.fl_stripe_unit)) - 1;
 792
 793        if ((new_version || (new_issued & CEPH_CAP_AUTH_SHARED)) &&
 794            (issued & CEPH_CAP_AUTH_EXCL) == 0) {
 795                inode->i_mode = le32_to_cpu(info->mode);
 796                inode->i_uid = make_kuid(&init_user_ns, le32_to_cpu(info->uid));
 797                inode->i_gid = make_kgid(&init_user_ns, le32_to_cpu(info->gid));
 798                dout("%p mode 0%o uid.gid %d.%d\n", inode, inode->i_mode,
 799                     from_kuid(&init_user_ns, inode->i_uid),
 800                     from_kgid(&init_user_ns, inode->i_gid));
 801        }
 802
 803        if ((new_version || (new_issued & CEPH_CAP_LINK_SHARED)) &&
 804            (issued & CEPH_CAP_LINK_EXCL) == 0)
 805                set_nlink(inode, le32_to_cpu(info->nlink));
 806
 807        if (new_version || (new_issued & CEPH_CAP_ANY_RD)) {
 808                /* be careful with mtime, atime, size */
 809                ceph_decode_timespec(&atime, &info->atime);
 810                ceph_decode_timespec(&mtime, &info->mtime);
 811                ceph_decode_timespec(&ctime, &info->ctime);
 812                ceph_fill_file_time(inode, issued,
 813                                le32_to_cpu(info->time_warp_seq),
 814                                &ctime, &mtime, &atime);
 815        }
 816
 817        if (new_version ||
 818            (new_issued & (CEPH_CAP_ANY_FILE_RD | CEPH_CAP_ANY_FILE_WR))) {
 819                s64 old_pool = ci->i_layout.pool_id;
 820                struct ceph_string *old_ns;
 821
 822                ceph_file_layout_from_legacy(&ci->i_layout, &info->layout);
 823                old_ns = rcu_dereference_protected(ci->i_layout.pool_ns,
 824                                        lockdep_is_held(&ci->i_ceph_lock));
 825                rcu_assign_pointer(ci->i_layout.pool_ns, pool_ns);
 826
 827                if (ci->i_layout.pool_id != old_pool || pool_ns != old_ns)
 828                        ci->i_ceph_flags &= ~CEPH_I_POOL_PERM;
 829
 830                pool_ns = old_ns;
 831
 832                queue_trunc = ceph_fill_file_size(inode, issued,
 833                                        le32_to_cpu(info->truncate_seq),
 834                                        le64_to_cpu(info->truncate_size),
 835                                        le64_to_cpu(info->size));
 836                /* only update max_size on auth cap */
 837                if ((info->cap.flags & CEPH_CAP_FLAG_AUTH) &&
 838                    ci->i_max_size != le64_to_cpu(info->max_size)) {
 839                        dout("max_size %lld -> %llu\n", ci->i_max_size,
 840                                        le64_to_cpu(info->max_size));
 841                        ci->i_max_size = le64_to_cpu(info->max_size);
 842                }
 843        }
 844
 845        /* xattrs */
 846        /* note that if i_xattrs.len <= 4, i_xattrs.data will still be NULL. */
 847        if ((ci->i_xattrs.version == 0 || !(issued & CEPH_CAP_XATTR_EXCL))  &&
 848            le64_to_cpu(info->xattr_version) > ci->i_xattrs.version) {
 849                if (ci->i_xattrs.blob)
 850                        ceph_buffer_put(ci->i_xattrs.blob);
 851                ci->i_xattrs.blob = xattr_blob;
 852                if (xattr_blob)
 853                        memcpy(ci->i_xattrs.blob->vec.iov_base,
 854                               iinfo->xattr_data, iinfo->xattr_len);
 855                ci->i_xattrs.version = le64_to_cpu(info->xattr_version);
 856                ceph_forget_all_cached_acls(inode);
 857                xattr_blob = NULL;
 858        }
 859
 860        inode->i_mapping->a_ops = &ceph_aops;
 861
 862        switch (inode->i_mode & S_IFMT) {
 863        case S_IFIFO:
 864        case S_IFBLK:
 865        case S_IFCHR:
 866        case S_IFSOCK:
 867                init_special_inode(inode, inode->i_mode, inode->i_rdev);
 868                inode->i_op = &ceph_file_iops;
 869                break;
 870        case S_IFREG:
 871                inode->i_op = &ceph_file_iops;
 872                inode->i_fop = &ceph_file_fops;
 873                break;
 874        case S_IFLNK:
 875                inode->i_op = &ceph_symlink_iops;
 876                if (!ci->i_symlink) {
 877                        u32 symlen = iinfo->symlink_len;
 878                        char *sym;
 879
 880                        spin_unlock(&ci->i_ceph_lock);
 881
 882                        if (symlen != i_size_read(inode)) {
 883                                pr_err("fill_inode %llx.%llx BAD symlink "
 884                                        "size %lld\n", ceph_vinop(inode),
 885                                        i_size_read(inode));
 886                                i_size_write(inode, symlen);
 887                                inode->i_blocks = calc_inode_blocks(symlen);
 888                        }
 889
 890                        err = -ENOMEM;
 891                        sym = kstrndup(iinfo->symlink, symlen, GFP_NOFS);
 892                        if (!sym)
 893                                goto out;
 894
 895                        spin_lock(&ci->i_ceph_lock);
 896                        if (!ci->i_symlink)
 897                                ci->i_symlink = sym;
 898                        else
 899                                kfree(sym); /* lost a race */
 900                }
 901                inode->i_link = ci->i_symlink;
 902                break;
 903        case S_IFDIR:
 904                inode->i_op = &ceph_dir_iops;
 905                inode->i_fop = &ceph_dir_fops;
 906
 907                ci->i_dir_layout = iinfo->dir_layout;
 908
 909                ci->i_files = le64_to_cpu(info->files);
 910                ci->i_subdirs = le64_to_cpu(info->subdirs);
 911                ci->i_rbytes = le64_to_cpu(info->rbytes);
 912                ci->i_rfiles = le64_to_cpu(info->rfiles);
 913                ci->i_rsubdirs = le64_to_cpu(info->rsubdirs);
 914                ceph_decode_timespec(&ci->i_rctime, &info->rctime);
 915                break;
 916        default:
 917                pr_err("fill_inode %llx.%llx BAD mode 0%o\n",
 918                       ceph_vinop(inode), inode->i_mode);
 919        }
 920
 921        /* were we issued a capability? */
 922        if (info->cap.caps) {
 923                if (ceph_snap(inode) == CEPH_NOSNAP) {
 924                        unsigned caps = le32_to_cpu(info->cap.caps);
 925                        ceph_add_cap(inode, session,
 926                                     le64_to_cpu(info->cap.cap_id),
 927                                     cap_fmode, caps,
 928                                     le32_to_cpu(info->cap.wanted),
 929                                     le32_to_cpu(info->cap.seq),
 930                                     le32_to_cpu(info->cap.mseq),
 931                                     le64_to_cpu(info->cap.realm),
 932                                     info->cap.flags, &new_cap);
 933
 934                        /* set dir completion flag? */
 935                        if (S_ISDIR(inode->i_mode) &&
 936                            ci->i_files == 0 && ci->i_subdirs == 0 &&
 937                            (caps & CEPH_CAP_FILE_SHARED) &&
 938                            (issued & CEPH_CAP_FILE_EXCL) == 0 &&
 939                            !__ceph_dir_is_complete(ci)) {
 940                                dout(" marking %p complete (empty)\n", inode);
 941                                i_size_write(inode, 0);
 942                                __ceph_dir_set_complete(ci,
 943                                        atomic64_read(&ci->i_release_count),
 944                                        atomic64_read(&ci->i_ordered_count));
 945                        }
 946
 947                        wake = true;
 948                } else {
 949                        dout(" %p got snap_caps %s\n", inode,
 950                             ceph_cap_string(le32_to_cpu(info->cap.caps)));
 951                        ci->i_snap_caps |= le32_to_cpu(info->cap.caps);
 952                        if (cap_fmode >= 0)
 953                                __ceph_get_fmode(ci, cap_fmode);
 954                }
 955        } else if (cap_fmode >= 0) {
 956                pr_warn("mds issued no caps on %llx.%llx\n",
 957                           ceph_vinop(inode));
 958                __ceph_get_fmode(ci, cap_fmode);
 959        }
 960
 961        if (iinfo->inline_version > 0 &&
 962            iinfo->inline_version >= ci->i_inline_version) {
 963                int cache_caps = CEPH_CAP_FILE_CACHE | CEPH_CAP_FILE_LAZYIO;
 964                ci->i_inline_version = iinfo->inline_version;
 965                if (ci->i_inline_version != CEPH_INLINE_NONE &&
 966                    (locked_page ||
 967                     (le32_to_cpu(info->cap.caps) & cache_caps)))
 968                        fill_inline = true;
 969        }
 970
 971        spin_unlock(&ci->i_ceph_lock);
 972
 973        if (fill_inline)
 974                ceph_fill_inline_data(inode, locked_page,
 975                                      iinfo->inline_data, iinfo->inline_len);
 976
 977        if (wake)
 978                wake_up_all(&ci->i_cap_wq);
 979
 980        /* queue truncate if we saw i_size decrease */
 981        if (queue_trunc)
 982                ceph_queue_vmtruncate(inode);
 983
 984        /* populate frag tree */
 985        if (S_ISDIR(inode->i_mode))
 986                ceph_fill_fragtree(inode, &info->fragtree, dirinfo);
 987
 988        /* update delegation info? */
 989        if (dirinfo)
 990                ceph_fill_dirfrag(inode, dirinfo);
 991
 992        err = 0;
 993out:
 994        if (new_cap)
 995                ceph_put_cap(mdsc, new_cap);
 996        if (xattr_blob)
 997                ceph_buffer_put(xattr_blob);
 998        ceph_put_string(pool_ns);
 999        return err;
1000}
1001
1002/*
1003 * caller should hold session s_mutex.
1004 */
1005static void update_dentry_lease(struct dentry *dentry,
1006                                struct ceph_mds_reply_lease *lease,
1007                                struct ceph_mds_session *session,
1008                                unsigned long from_time,
1009                                struct ceph_vino *tgt_vino,
1010                                struct ceph_vino *dir_vino)
1011{
1012        struct ceph_dentry_info *di = ceph_dentry(dentry);
1013        long unsigned duration = le32_to_cpu(lease->duration_ms);
1014        long unsigned ttl = from_time + (duration * HZ) / 1000;
1015        long unsigned half_ttl = from_time + (duration * HZ / 2) / 1000;
1016        struct inode *dir;
1017        struct ceph_mds_session *old_lease_session = NULL;
1018
1019        /*
1020         * Make sure dentry's inode matches tgt_vino. NULL tgt_vino means that
1021         * we expect a negative dentry.
1022         */
1023        if (!tgt_vino && d_really_is_positive(dentry))
1024                return;
1025
1026        if (tgt_vino && (d_really_is_negative(dentry) ||
1027                        !ceph_ino_compare(d_inode(dentry), tgt_vino)))
1028                return;
1029
1030        spin_lock(&dentry->d_lock);
1031        dout("update_dentry_lease %p duration %lu ms ttl %lu\n",
1032             dentry, duration, ttl);
1033
1034        dir = d_inode(dentry->d_parent);
1035
1036        /* make sure parent matches dir_vino */
1037        if (!ceph_ino_compare(dir, dir_vino))
1038                goto out_unlock;
1039
1040        /* only track leases on regular dentries */
1041        if (ceph_snap(dir) != CEPH_NOSNAP)
1042                goto out_unlock;
1043
1044        di->lease_shared_gen = atomic_read(&ceph_inode(dir)->i_shared_gen);
1045
1046        if (duration == 0)
1047                goto out_unlock;
1048
1049        if (di->lease_gen == session->s_cap_gen &&
1050            time_before(ttl, di->time))
1051                goto out_unlock;  /* we already have a newer lease. */
1052
1053        if (di->lease_session && di->lease_session != session) {
1054                old_lease_session = di->lease_session;
1055                di->lease_session = NULL;
1056        }
1057
1058        ceph_dentry_lru_touch(dentry);
1059
1060        if (!di->lease_session)
1061                di->lease_session = ceph_get_mds_session(session);
1062        di->lease_gen = session->s_cap_gen;
1063        di->lease_seq = le32_to_cpu(lease->seq);
1064        di->lease_renew_after = half_ttl;
1065        di->lease_renew_from = 0;
1066        di->time = ttl;
1067out_unlock:
1068        spin_unlock(&dentry->d_lock);
1069        if (old_lease_session)
1070                ceph_put_mds_session(old_lease_session);
1071}
1072
1073/*
1074 * splice a dentry to an inode.
1075 * caller must hold directory i_mutex for this to be safe.
1076 */
1077static struct dentry *splice_dentry(struct dentry *dn, struct inode *in)
1078{
1079        struct dentry *realdn;
1080
1081        BUG_ON(d_inode(dn));
1082
1083        if (S_ISDIR(in->i_mode)) {
1084                /* If inode is directory, d_splice_alias() below will remove
1085                 * 'realdn' from its origin parent. We need to ensure that
1086                 * origin parent's readdir cache will not reference 'realdn'
1087                 */
1088                realdn = d_find_any_alias(in);
1089                if (realdn) {
1090                        struct ceph_dentry_info *di = ceph_dentry(realdn);
1091                        spin_lock(&realdn->d_lock);
1092
1093                        realdn->d_op->d_prune(realdn);
1094
1095                        di->time = jiffies;
1096                        di->lease_shared_gen = 0;
1097                        di->offset = 0;
1098
1099                        spin_unlock(&realdn->d_lock);
1100                        dput(realdn);
1101                }
1102        }
1103
1104        /* dn must be unhashed */
1105        if (!d_unhashed(dn))
1106                d_drop(dn);
1107        realdn = d_splice_alias(in, dn);
1108        if (IS_ERR(realdn)) {
1109                pr_err("splice_dentry error %ld %p inode %p ino %llx.%llx\n",
1110                       PTR_ERR(realdn), dn, in, ceph_vinop(in));
1111                dn = realdn; /* note realdn contains the error */
1112                goto out;
1113        } else if (realdn) {
1114                dout("dn %p (%d) spliced with %p (%d) "
1115                     "inode %p ino %llx.%llx\n",
1116                     dn, d_count(dn),
1117                     realdn, d_count(realdn),
1118                     d_inode(realdn), ceph_vinop(d_inode(realdn)));
1119                dput(dn);
1120                dn = realdn;
1121        } else {
1122                BUG_ON(!ceph_dentry(dn));
1123                dout("dn %p attached to %p ino %llx.%llx\n",
1124                     dn, d_inode(dn), ceph_vinop(d_inode(dn)));
1125        }
1126out:
1127        return dn;
1128}
1129
1130/*
1131 * Incorporate results into the local cache.  This is either just
1132 * one inode, or a directory, dentry, and possibly linked-to inode (e.g.,
1133 * after a lookup).
1134 *
1135 * A reply may contain
1136 *         a directory inode along with a dentry.
1137 *  and/or a target inode
1138 *
1139 * Called with snap_rwsem (read).
1140 */
1141int ceph_fill_trace(struct super_block *sb, struct ceph_mds_request *req)
1142{
1143        struct ceph_mds_session *session = req->r_session;
1144        struct ceph_mds_reply_info_parsed *rinfo = &req->r_reply_info;
1145        struct inode *in = NULL;
1146        struct ceph_vino tvino, dvino;
1147        struct ceph_fs_client *fsc = ceph_sb_to_client(sb);
1148        int err = 0;
1149
1150        dout("fill_trace %p is_dentry %d is_target %d\n", req,
1151             rinfo->head->is_dentry, rinfo->head->is_target);
1152
1153        if (!rinfo->head->is_target && !rinfo->head->is_dentry) {
1154                dout("fill_trace reply is empty!\n");
1155                if (rinfo->head->result == 0 && req->r_parent)
1156                        ceph_invalidate_dir_request(req);
1157                return 0;
1158        }
1159
1160        if (rinfo->head->is_dentry) {
1161                struct inode *dir = req->r_parent;
1162
1163                if (dir) {
1164                        err = fill_inode(dir, NULL,
1165                                         &rinfo->diri, rinfo->dirfrag,
1166                                         session, req->r_request_started, -1,
1167                                         &req->r_caps_reservation);
1168                        if (err < 0)
1169                                goto done;
1170                } else {
1171                        WARN_ON_ONCE(1);
1172                }
1173
1174                if (dir && req->r_op == CEPH_MDS_OP_LOOKUPNAME) {
1175                        struct qstr dname;
1176                        struct dentry *dn, *parent;
1177
1178                        BUG_ON(!rinfo->head->is_target);
1179                        BUG_ON(req->r_dentry);
1180
1181                        parent = d_find_any_alias(dir);
1182                        BUG_ON(!parent);
1183
1184                        dname.name = rinfo->dname;
1185                        dname.len = rinfo->dname_len;
1186                        dname.hash = full_name_hash(parent, dname.name, dname.len);
1187                        tvino.ino = le64_to_cpu(rinfo->targeti.in->ino);
1188                        tvino.snap = le64_to_cpu(rinfo->targeti.in->snapid);
1189retry_lookup:
1190                        dn = d_lookup(parent, &dname);
1191                        dout("d_lookup on parent=%p name=%.*s got %p\n",
1192                             parent, dname.len, dname.name, dn);
1193
1194                        if (!dn) {
1195                                dn = d_alloc(parent, &dname);
1196                                dout("d_alloc %p '%.*s' = %p\n", parent,
1197                                     dname.len, dname.name, dn);
1198                                if (!dn) {
1199                                        dput(parent);
1200                                        err = -ENOMEM;
1201                                        goto done;
1202                                }
1203                                err = 0;
1204                        } else if (d_really_is_positive(dn) &&
1205                                   (ceph_ino(d_inode(dn)) != tvino.ino ||
1206                                    ceph_snap(d_inode(dn)) != tvino.snap)) {
1207                                dout(" dn %p points to wrong inode %p\n",
1208                                     dn, d_inode(dn));
1209                                ceph_dir_clear_ordered(dir);
1210                                d_delete(dn);
1211                                dput(dn);
1212                                goto retry_lookup;
1213                        }
1214
1215                        req->r_dentry = dn;
1216                        dput(parent);
1217                }
1218        }
1219
1220        if (rinfo->head->is_target) {
1221                tvino.ino = le64_to_cpu(rinfo->targeti.in->ino);
1222                tvino.snap = le64_to_cpu(rinfo->targeti.in->snapid);
1223
1224                in = ceph_get_inode(sb, tvino);
1225                if (IS_ERR(in)) {
1226                        err = PTR_ERR(in);
1227                        goto done;
1228                }
1229                req->r_target_inode = in;
1230
1231                err = fill_inode(in, req->r_locked_page, &rinfo->targeti, NULL,
1232                                session, req->r_request_started,
1233                                (!test_bit(CEPH_MDS_R_ABORTED, &req->r_req_flags) &&
1234                                rinfo->head->result == 0) ?  req->r_fmode : -1,
1235                                &req->r_caps_reservation);
1236                if (err < 0) {
1237                        pr_err("fill_inode badness %p %llx.%llx\n",
1238                                in, ceph_vinop(in));
1239                        goto done;
1240                }
1241        }
1242
1243        /*
1244         * ignore null lease/binding on snapdir ENOENT, or else we
1245         * will have trouble splicing in the virtual snapdir later
1246         */
1247        if (rinfo->head->is_dentry &&
1248            !test_bit(CEPH_MDS_R_ABORTED, &req->r_req_flags) &&
1249            test_bit(CEPH_MDS_R_PARENT_LOCKED, &req->r_req_flags) &&
1250            (rinfo->head->is_target || strncmp(req->r_dentry->d_name.name,
1251                                               fsc->mount_options->snapdir_name,
1252                                               req->r_dentry->d_name.len))) {
1253                /*
1254                 * lookup link rename   : null -> possibly existing inode
1255                 * mknod symlink mkdir  : null -> new inode
1256                 * unlink               : linked -> null
1257                 */
1258                struct inode *dir = req->r_parent;
1259                struct dentry *dn = req->r_dentry;
1260                bool have_dir_cap, have_lease;
1261
1262                BUG_ON(!dn);
1263                BUG_ON(!dir);
1264                BUG_ON(d_inode(dn->d_parent) != dir);
1265
1266                dvino.ino = le64_to_cpu(rinfo->diri.in->ino);
1267                dvino.snap = le64_to_cpu(rinfo->diri.in->snapid);
1268
1269                BUG_ON(ceph_ino(dir) != dvino.ino);
1270                BUG_ON(ceph_snap(dir) != dvino.snap);
1271
1272                /* do we have a lease on the whole dir? */
1273                have_dir_cap =
1274                        (le32_to_cpu(rinfo->diri.in->cap.caps) &
1275                         CEPH_CAP_FILE_SHARED);
1276
1277                /* do we have a dn lease? */
1278                have_lease = have_dir_cap ||
1279                        le32_to_cpu(rinfo->dlease->duration_ms);
1280                if (!have_lease)
1281                        dout("fill_trace  no dentry lease or dir cap\n");
1282
1283                /* rename? */
1284                if (req->r_old_dentry && req->r_op == CEPH_MDS_OP_RENAME) {
1285                        struct inode *olddir = req->r_old_dentry_dir;
1286                        BUG_ON(!olddir);
1287
1288                        dout(" src %p '%pd' dst %p '%pd'\n",
1289                             req->r_old_dentry,
1290                             req->r_old_dentry,
1291                             dn, dn);
1292                        dout("fill_trace doing d_move %p -> %p\n",
1293                             req->r_old_dentry, dn);
1294
1295                        /* d_move screws up sibling dentries' offsets */
1296                        ceph_dir_clear_ordered(dir);
1297                        ceph_dir_clear_ordered(olddir);
1298
1299                        d_move(req->r_old_dentry, dn);
1300                        dout(" src %p '%pd' dst %p '%pd'\n",
1301                             req->r_old_dentry,
1302                             req->r_old_dentry,
1303                             dn, dn);
1304
1305                        /* ensure target dentry is invalidated, despite
1306                           rehashing bug in vfs_rename_dir */
1307                        ceph_invalidate_dentry_lease(dn);
1308
1309                        dout("dn %p gets new offset %lld\n", req->r_old_dentry,
1310                             ceph_dentry(req->r_old_dentry)->offset);
1311
1312                        dn = req->r_old_dentry;  /* use old_dentry */
1313                }
1314
1315                /* null dentry? */
1316                if (!rinfo->head->is_target) {
1317                        dout("fill_trace null dentry\n");
1318                        if (d_really_is_positive(dn)) {
1319                                dout("d_delete %p\n", dn);
1320                                ceph_dir_clear_ordered(dir);
1321                                d_delete(dn);
1322                        } else if (have_lease) {
1323                                if (d_unhashed(dn))
1324                                        d_add(dn, NULL);
1325                                update_dentry_lease(dn, rinfo->dlease,
1326                                                    session,
1327                                                    req->r_request_started,
1328                                                    NULL, &dvino);
1329                        }
1330                        goto done;
1331                }
1332
1333                /* attach proper inode */
1334                if (d_really_is_negative(dn)) {
1335                        ceph_dir_clear_ordered(dir);
1336                        ihold(in);
1337                        dn = splice_dentry(dn, in);
1338                        if (IS_ERR(dn)) {
1339                                err = PTR_ERR(dn);
1340                                goto done;
1341                        }
1342                        req->r_dentry = dn;  /* may have spliced */
1343                } else if (d_really_is_positive(dn) && d_inode(dn) != in) {
1344                        dout(" %p links to %p %llx.%llx, not %llx.%llx\n",
1345                             dn, d_inode(dn), ceph_vinop(d_inode(dn)),
1346                             ceph_vinop(in));
1347                        d_invalidate(dn);
1348                        have_lease = false;
1349                }
1350
1351                if (have_lease) {
1352                        tvino.ino = le64_to_cpu(rinfo->targeti.in->ino);
1353                        tvino.snap = le64_to_cpu(rinfo->targeti.in->snapid);
1354                        update_dentry_lease(dn, rinfo->dlease, session,
1355                                            req->r_request_started,
1356                                            &tvino, &dvino);
1357                }
1358                dout(" final dn %p\n", dn);
1359        } else if ((req->r_op == CEPH_MDS_OP_LOOKUPSNAP ||
1360                    req->r_op == CEPH_MDS_OP_MKSNAP) &&
1361                   !test_bit(CEPH_MDS_R_ABORTED, &req->r_req_flags)) {
1362                struct dentry *dn = req->r_dentry;
1363                struct inode *dir = req->r_parent;
1364
1365                /* fill out a snapdir LOOKUPSNAP dentry */
1366                BUG_ON(!dn);
1367                BUG_ON(!dir);
1368                BUG_ON(ceph_snap(dir) != CEPH_SNAPDIR);
1369                dout(" linking snapped dir %p to dn %p\n", in, dn);
1370                ceph_dir_clear_ordered(dir);
1371                ihold(in);
1372                dn = splice_dentry(dn, in);
1373                if (IS_ERR(dn)) {
1374                        err = PTR_ERR(dn);
1375                        goto done;
1376                }
1377                req->r_dentry = dn;  /* may have spliced */
1378        } else if (rinfo->head->is_dentry) {
1379                struct ceph_vino *ptvino = NULL;
1380
1381                if ((le32_to_cpu(rinfo->diri.in->cap.caps) & CEPH_CAP_FILE_SHARED) ||
1382                    le32_to_cpu(rinfo->dlease->duration_ms)) {
1383                        dvino.ino = le64_to_cpu(rinfo->diri.in->ino);
1384                        dvino.snap = le64_to_cpu(rinfo->diri.in->snapid);
1385
1386                        if (rinfo->head->is_target) {
1387                                tvino.ino = le64_to_cpu(rinfo->targeti.in->ino);
1388                                tvino.snap = le64_to_cpu(rinfo->targeti.in->snapid);
1389                                ptvino = &tvino;
1390                        }
1391
1392                        update_dentry_lease(req->r_dentry, rinfo->dlease,
1393                                session, req->r_request_started, ptvino,
1394                                &dvino);
1395                } else {
1396                        dout("%s: no dentry lease or dir cap\n", __func__);
1397                }
1398        }
1399done:
1400        dout("fill_trace done err=%d\n", err);
1401        return err;
1402}
1403
1404/*
1405 * Prepopulate our cache with readdir results, leases, etc.
1406 */
1407static int readdir_prepopulate_inodes_only(struct ceph_mds_request *req,
1408                                           struct ceph_mds_session *session)
1409{
1410        struct ceph_mds_reply_info_parsed *rinfo = &req->r_reply_info;
1411        int i, err = 0;
1412
1413        for (i = 0; i < rinfo->dir_nr; i++) {
1414                struct ceph_mds_reply_dir_entry *rde = rinfo->dir_entries + i;
1415                struct ceph_vino vino;
1416                struct inode *in;
1417                int rc;
1418
1419                vino.ino = le64_to_cpu(rde->inode.in->ino);
1420                vino.snap = le64_to_cpu(rde->inode.in->snapid);
1421
1422                in = ceph_get_inode(req->r_dentry->d_sb, vino);
1423                if (IS_ERR(in)) {
1424                        err = PTR_ERR(in);
1425                        dout("new_inode badness got %d\n", err);
1426                        continue;
1427                }
1428                rc = fill_inode(in, NULL, &rde->inode, NULL, session,
1429                                req->r_request_started, -1,
1430                                &req->r_caps_reservation);
1431                if (rc < 0) {
1432                        pr_err("fill_inode badness on %p got %d\n", in, rc);
1433                        err = rc;
1434                }
1435                iput(in);
1436        }
1437
1438        return err;
1439}
1440
1441void ceph_readdir_cache_release(struct ceph_readdir_cache_control *ctl)
1442{
1443        if (ctl->page) {
1444                kunmap(ctl->page);
1445                put_page(ctl->page);
1446                ctl->page = NULL;
1447        }
1448}
1449
1450static int fill_readdir_cache(struct inode *dir, struct dentry *dn,
1451                              struct ceph_readdir_cache_control *ctl,
1452                              struct ceph_mds_request *req)
1453{
1454        struct ceph_inode_info *ci = ceph_inode(dir);
1455        unsigned nsize = PAGE_SIZE / sizeof(struct dentry*);
1456        unsigned idx = ctl->index % nsize;
1457        pgoff_t pgoff = ctl->index / nsize;
1458
1459        if (!ctl->page || pgoff != page_index(ctl->page)) {
1460                ceph_readdir_cache_release(ctl);
1461                if (idx == 0)
1462                        ctl->page = grab_cache_page(&dir->i_data, pgoff);
1463                else
1464                        ctl->page = find_lock_page(&dir->i_data, pgoff);
1465                if (!ctl->page) {
1466                        ctl->index = -1;
1467                        return idx == 0 ? -ENOMEM : 0;
1468                }
1469                /* reading/filling the cache are serialized by
1470                 * i_mutex, no need to use page lock */
1471                unlock_page(ctl->page);
1472                ctl->dentries = kmap(ctl->page);
1473                if (idx == 0)
1474                        memset(ctl->dentries, 0, PAGE_SIZE);
1475        }
1476
1477        if (req->r_dir_release_cnt == atomic64_read(&ci->i_release_count) &&
1478            req->r_dir_ordered_cnt == atomic64_read(&ci->i_ordered_count)) {
1479                dout("readdir cache dn %p idx %d\n", dn, ctl->index);
1480                ctl->dentries[idx] = dn;
1481                ctl->index++;
1482        } else {
1483                dout("disable readdir cache\n");
1484                ctl->index = -1;
1485        }
1486        return 0;
1487}
1488
1489int ceph_readdir_prepopulate(struct ceph_mds_request *req,
1490                             struct ceph_mds_session *session)
1491{
1492        struct dentry *parent = req->r_dentry;
1493        struct ceph_inode_info *ci = ceph_inode(d_inode(parent));
1494        struct ceph_mds_reply_info_parsed *rinfo = &req->r_reply_info;
1495        struct qstr dname;
1496        struct dentry *dn;
1497        struct inode *in;
1498        int err = 0, skipped = 0, ret, i;
1499        struct ceph_mds_request_head *rhead = req->r_request->front.iov_base;
1500        u32 frag = le32_to_cpu(rhead->args.readdir.frag);
1501        u32 last_hash = 0;
1502        u32 fpos_offset;
1503        struct ceph_readdir_cache_control cache_ctl = {};
1504
1505        if (test_bit(CEPH_MDS_R_ABORTED, &req->r_req_flags))
1506                return readdir_prepopulate_inodes_only(req, session);
1507
1508        if (rinfo->hash_order) {
1509                if (req->r_path2) {
1510                        last_hash = ceph_str_hash(ci->i_dir_layout.dl_dir_hash,
1511                                                  req->r_path2,
1512                                                  strlen(req->r_path2));
1513                        last_hash = ceph_frag_value(last_hash);
1514                } else if (rinfo->offset_hash) {
1515                        /* mds understands offset_hash */
1516                        WARN_ON_ONCE(req->r_readdir_offset != 2);
1517                        last_hash = le32_to_cpu(rhead->args.readdir.offset_hash);
1518                }
1519        }
1520
1521        if (rinfo->dir_dir &&
1522            le32_to_cpu(rinfo->dir_dir->frag) != frag) {
1523                dout("readdir_prepopulate got new frag %x -> %x\n",
1524                     frag, le32_to_cpu(rinfo->dir_dir->frag));
1525                frag = le32_to_cpu(rinfo->dir_dir->frag);
1526                if (!rinfo->hash_order)
1527                        req->r_readdir_offset = 2;
1528        }
1529
1530        if (le32_to_cpu(rinfo->head->op) == CEPH_MDS_OP_LSSNAP) {
1531                dout("readdir_prepopulate %d items under SNAPDIR dn %p\n",
1532                     rinfo->dir_nr, parent);
1533        } else {
1534                dout("readdir_prepopulate %d items under dn %p\n",
1535                     rinfo->dir_nr, parent);
1536                if (rinfo->dir_dir)
1537                        ceph_fill_dirfrag(d_inode(parent), rinfo->dir_dir);
1538
1539                if (ceph_frag_is_leftmost(frag) &&
1540                    req->r_readdir_offset == 2 &&
1541                    !(rinfo->hash_order && last_hash)) {
1542                        /* note dir version at start of readdir so we can
1543                         * tell if any dentries get dropped */
1544                        req->r_dir_release_cnt =
1545                                atomic64_read(&ci->i_release_count);
1546                        req->r_dir_ordered_cnt =
1547                                atomic64_read(&ci->i_ordered_count);
1548                        req->r_readdir_cache_idx = 0;
1549                }
1550        }
1551
1552        cache_ctl.index = req->r_readdir_cache_idx;
1553        fpos_offset = req->r_readdir_offset;
1554
1555        /* FIXME: release caps/leases if error occurs */
1556        for (i = 0; i < rinfo->dir_nr; i++) {
1557                struct ceph_mds_reply_dir_entry *rde = rinfo->dir_entries + i;
1558                struct ceph_vino tvino, dvino;
1559
1560                dname.name = rde->name;
1561                dname.len = rde->name_len;
1562                dname.hash = full_name_hash(parent, dname.name, dname.len);
1563
1564                tvino.ino = le64_to_cpu(rde->inode.in->ino);
1565                tvino.snap = le64_to_cpu(rde->inode.in->snapid);
1566
1567                if (rinfo->hash_order) {
1568                        u32 hash = ceph_str_hash(ci->i_dir_layout.dl_dir_hash,
1569                                                 rde->name, rde->name_len);
1570                        hash = ceph_frag_value(hash);
1571                        if (hash != last_hash)
1572                                fpos_offset = 2;
1573                        last_hash = hash;
1574                        rde->offset = ceph_make_fpos(hash, fpos_offset++, true);
1575                } else {
1576                        rde->offset = ceph_make_fpos(frag, fpos_offset++, false);
1577                }
1578
1579retry_lookup:
1580                dn = d_lookup(parent, &dname);
1581                dout("d_lookup on parent=%p name=%.*s got %p\n",
1582                     parent, dname.len, dname.name, dn);
1583
1584                if (!dn) {
1585                        dn = d_alloc(parent, &dname);
1586                        dout("d_alloc %p '%.*s' = %p\n", parent,
1587                             dname.len, dname.name, dn);
1588                        if (!dn) {
1589                                dout("d_alloc badness\n");
1590                                err = -ENOMEM;
1591                                goto out;
1592                        }
1593                } else if (d_really_is_positive(dn) &&
1594                           (ceph_ino(d_inode(dn)) != tvino.ino ||
1595                            ceph_snap(d_inode(dn)) != tvino.snap)) {
1596                        struct ceph_dentry_info *di = ceph_dentry(dn);
1597                        dout(" dn %p points to wrong inode %p\n",
1598                             dn, d_inode(dn));
1599
1600                        spin_lock(&dn->d_lock);
1601                        if (di->offset > 0 &&
1602                            di->lease_shared_gen ==
1603                            atomic_read(&ci->i_shared_gen)) {
1604                                __ceph_dir_clear_ordered(ci);
1605                                di->offset = 0;
1606                        }
1607                        spin_unlock(&dn->d_lock);
1608
1609                        d_delete(dn);
1610                        dput(dn);
1611                        goto retry_lookup;
1612                }
1613
1614                /* inode */
1615                if (d_really_is_positive(dn)) {
1616                        in = d_inode(dn);
1617                } else {
1618                        in = ceph_get_inode(parent->d_sb, tvino);
1619                        if (IS_ERR(in)) {
1620                                dout("new_inode badness\n");
1621                                d_drop(dn);
1622                                dput(dn);
1623                                err = PTR_ERR(in);
1624                                goto out;
1625                        }
1626                }
1627
1628                ret = fill_inode(in, NULL, &rde->inode, NULL, session,
1629                                 req->r_request_started, -1,
1630                                 &req->r_caps_reservation);
1631                if (ret < 0) {
1632                        pr_err("fill_inode badness on %p\n", in);
1633                        if (d_really_is_negative(dn))
1634                                iput(in);
1635                        d_drop(dn);
1636                        err = ret;
1637                        goto next_item;
1638                }
1639
1640                if (d_really_is_negative(dn)) {
1641                        struct dentry *realdn;
1642
1643                        if (ceph_security_xattr_deadlock(in)) {
1644                                dout(" skip splicing dn %p to inode %p"
1645                                     " (security xattr deadlock)\n", dn, in);
1646                                iput(in);
1647                                skipped++;
1648                                goto next_item;
1649                        }
1650
1651                        realdn = splice_dentry(dn, in);
1652                        if (IS_ERR(realdn)) {
1653                                err = PTR_ERR(realdn);
1654                                d_drop(dn);
1655                                dn = NULL;
1656                                goto next_item;
1657                        }
1658                        dn = realdn;
1659                }
1660
1661                ceph_dentry(dn)->offset = rde->offset;
1662
1663                dvino = ceph_vino(d_inode(parent));
1664                update_dentry_lease(dn, rde->lease, req->r_session,
1665                                    req->r_request_started, &tvino, &dvino);
1666
1667                if (err == 0 && skipped == 0 && cache_ctl.index >= 0) {
1668                        ret = fill_readdir_cache(d_inode(parent), dn,
1669                                                 &cache_ctl, req);
1670                        if (ret < 0)
1671                                err = ret;
1672                }
1673next_item:
1674                if (dn)
1675                        dput(dn);
1676        }
1677out:
1678        if (err == 0 && skipped == 0) {
1679                set_bit(CEPH_MDS_R_DID_PREPOPULATE, &req->r_req_flags);
1680                req->r_readdir_cache_idx = cache_ctl.index;
1681        }
1682        ceph_readdir_cache_release(&cache_ctl);
1683        dout("readdir_prepopulate done\n");
1684        return err;
1685}
1686
1687bool ceph_inode_set_size(struct inode *inode, loff_t size)
1688{
1689        struct ceph_inode_info *ci = ceph_inode(inode);
1690        bool ret;
1691
1692        spin_lock(&ci->i_ceph_lock);
1693        dout("set_size %p %llu -> %llu\n", inode, inode->i_size, size);
1694        i_size_write(inode, size);
1695        inode->i_blocks = calc_inode_blocks(size);
1696
1697        ret = __ceph_should_report_size(ci);
1698
1699        spin_unlock(&ci->i_ceph_lock);
1700        return ret;
1701}
1702
1703/*
1704 * Write back inode data in a worker thread.  (This can't be done
1705 * in the message handler context.)
1706 */
1707void ceph_queue_writeback(struct inode *inode)
1708{
1709        ihold(inode);
1710        if (queue_work(ceph_inode_to_client(inode)->wb_wq,
1711                       &ceph_inode(inode)->i_wb_work)) {
1712                dout("ceph_queue_writeback %p\n", inode);
1713        } else {
1714                dout("ceph_queue_writeback %p failed\n", inode);
1715                iput(inode);
1716        }
1717}
1718
1719static void ceph_writeback_work(struct work_struct *work)
1720{
1721        struct ceph_inode_info *ci = container_of(work, struct ceph_inode_info,
1722                                                  i_wb_work);
1723        struct inode *inode = &ci->vfs_inode;
1724
1725        dout("writeback %p\n", inode);
1726        filemap_fdatawrite(&inode->i_data);
1727        iput(inode);
1728}
1729
1730/*
1731 * queue an async invalidation
1732 */
1733void ceph_queue_invalidate(struct inode *inode)
1734{
1735        ihold(inode);
1736        if (queue_work(ceph_inode_to_client(inode)->pg_inv_wq,
1737                       &ceph_inode(inode)->i_pg_inv_work)) {
1738                dout("ceph_queue_invalidate %p\n", inode);
1739        } else {
1740                dout("ceph_queue_invalidate %p failed\n", inode);
1741                iput(inode);
1742        }
1743}
1744
1745/*
1746 * Invalidate inode pages in a worker thread.  (This can't be done
1747 * in the message handler context.)
1748 */
1749static void ceph_invalidate_work(struct work_struct *work)
1750{
1751        struct ceph_inode_info *ci = container_of(work, struct ceph_inode_info,
1752                                                  i_pg_inv_work);
1753        struct inode *inode = &ci->vfs_inode;
1754        struct ceph_fs_client *fsc = ceph_inode_to_client(inode);
1755        u32 orig_gen;
1756        int check = 0;
1757
1758        mutex_lock(&ci->i_truncate_mutex);
1759
1760        if (READ_ONCE(fsc->mount_state) == CEPH_MOUNT_SHUTDOWN) {
1761                pr_warn_ratelimited("invalidate_pages %p %lld forced umount\n",
1762                                    inode, ceph_ino(inode));
1763                mapping_set_error(inode->i_mapping, -EIO);
1764                truncate_pagecache(inode, 0);
1765                mutex_unlock(&ci->i_truncate_mutex);
1766                goto out;
1767        }
1768
1769        spin_lock(&ci->i_ceph_lock);
1770        dout("invalidate_pages %p gen %d revoking %d\n", inode,
1771             ci->i_rdcache_gen, ci->i_rdcache_revoking);
1772        if (ci->i_rdcache_revoking != ci->i_rdcache_gen) {
1773                if (__ceph_caps_revoking_other(ci, NULL, CEPH_CAP_FILE_CACHE))
1774                        check = 1;
1775                spin_unlock(&ci->i_ceph_lock);
1776                mutex_unlock(&ci->i_truncate_mutex);
1777                goto out;
1778        }
1779        orig_gen = ci->i_rdcache_gen;
1780        spin_unlock(&ci->i_ceph_lock);
1781
1782        if (invalidate_inode_pages2(inode->i_mapping) < 0) {
1783                pr_err("invalidate_pages %p fails\n", inode);
1784        }
1785
1786        spin_lock(&ci->i_ceph_lock);
1787        if (orig_gen == ci->i_rdcache_gen &&
1788            orig_gen == ci->i_rdcache_revoking) {
1789                dout("invalidate_pages %p gen %d successful\n", inode,
1790                     ci->i_rdcache_gen);
1791                ci->i_rdcache_revoking--;
1792                check = 1;
1793        } else {
1794                dout("invalidate_pages %p gen %d raced, now %d revoking %d\n",
1795                     inode, orig_gen, ci->i_rdcache_gen,
1796                     ci->i_rdcache_revoking);
1797                if (__ceph_caps_revoking_other(ci, NULL, CEPH_CAP_FILE_CACHE))
1798                        check = 1;
1799        }
1800        spin_unlock(&ci->i_ceph_lock);
1801        mutex_unlock(&ci->i_truncate_mutex);
1802out:
1803        if (check)
1804                ceph_check_caps(ci, 0, NULL);
1805        iput(inode);
1806}
1807
1808
1809/*
1810 * called by trunc_wq;
1811 *
1812 * We also truncate in a separate thread as well.
1813 */
1814static void ceph_vmtruncate_work(struct work_struct *work)
1815{
1816        struct ceph_inode_info *ci = container_of(work, struct ceph_inode_info,
1817                                                  i_vmtruncate_work);
1818        struct inode *inode = &ci->vfs_inode;
1819
1820        dout("vmtruncate_work %p\n", inode);
1821        __ceph_do_pending_vmtruncate(inode);
1822        iput(inode);
1823}
1824
1825/*
1826 * Queue an async vmtruncate.  If we fail to queue work, we will handle
1827 * the truncation the next time we call __ceph_do_pending_vmtruncate.
1828 */
1829void ceph_queue_vmtruncate(struct inode *inode)
1830{
1831        struct ceph_inode_info *ci = ceph_inode(inode);
1832
1833        ihold(inode);
1834
1835        if (queue_work(ceph_sb_to_client(inode->i_sb)->trunc_wq,
1836                       &ci->i_vmtruncate_work)) {
1837                dout("ceph_queue_vmtruncate %p\n", inode);
1838        } else {
1839                dout("ceph_queue_vmtruncate %p failed, pending=%d\n",
1840                     inode, ci->i_truncate_pending);
1841                iput(inode);
1842        }
1843}
1844
1845/*
1846 * Make sure any pending truncation is applied before doing anything
1847 * that may depend on it.
1848 */
1849void __ceph_do_pending_vmtruncate(struct inode *inode)
1850{
1851        struct ceph_inode_info *ci = ceph_inode(inode);
1852        u64 to;
1853        int wrbuffer_refs, finish = 0;
1854
1855        mutex_lock(&ci->i_truncate_mutex);
1856retry:
1857        spin_lock(&ci->i_ceph_lock);
1858        if (ci->i_truncate_pending == 0) {
1859                dout("__do_pending_vmtruncate %p none pending\n", inode);
1860                spin_unlock(&ci->i_ceph_lock);
1861                mutex_unlock(&ci->i_truncate_mutex);
1862                return;
1863        }
1864
1865        /*
1866         * make sure any dirty snapped pages are flushed before we
1867         * possibly truncate them.. so write AND block!
1868         */
1869        if (ci->i_wrbuffer_ref_head < ci->i_wrbuffer_ref) {
1870                struct ceph_cap_snap *capsnap;
1871                to = ci->i_truncate_size;
1872                list_for_each_entry(capsnap, &ci->i_cap_snaps, ci_item) {
1873                        // MDS should have revoked Frw caps
1874                        WARN_ON_ONCE(capsnap->writing);
1875                        if (capsnap->dirty_pages && capsnap->size > to)
1876                                to = capsnap->size;
1877                }
1878                spin_unlock(&ci->i_ceph_lock);
1879                dout("__do_pending_vmtruncate %p flushing snaps first\n",
1880                     inode);
1881
1882                truncate_pagecache(inode, to);
1883
1884                filemap_write_and_wait_range(&inode->i_data, 0,
1885                                             inode->i_sb->s_maxbytes);
1886                goto retry;
1887        }
1888
1889        /* there should be no reader or writer */
1890        WARN_ON_ONCE(ci->i_rd_ref || ci->i_wr_ref);
1891
1892        to = ci->i_truncate_size;
1893        wrbuffer_refs = ci->i_wrbuffer_ref;
1894        dout("__do_pending_vmtruncate %p (%d) to %lld\n", inode,
1895             ci->i_truncate_pending, to);
1896        spin_unlock(&ci->i_ceph_lock);
1897
1898        truncate_pagecache(inode, to);
1899
1900        spin_lock(&ci->i_ceph_lock);
1901        if (to == ci->i_truncate_size) {
1902                ci->i_truncate_pending = 0;
1903                finish = 1;
1904        }
1905        spin_unlock(&ci->i_ceph_lock);
1906        if (!finish)
1907                goto retry;
1908
1909        mutex_unlock(&ci->i_truncate_mutex);
1910
1911        if (wrbuffer_refs == 0)
1912                ceph_check_caps(ci, CHECK_CAPS_AUTHONLY, NULL);
1913
1914        wake_up_all(&ci->i_cap_wq);
1915}
1916
1917/*
1918 * symlinks
1919 */
1920static const struct inode_operations ceph_symlink_iops = {
1921        .get_link = simple_get_link,
1922        .setattr = ceph_setattr,
1923        .getattr = ceph_getattr,
1924        .listxattr = ceph_listxattr,
1925};
1926
1927int __ceph_setattr(struct inode *inode, struct iattr *attr)
1928{
1929        struct ceph_inode_info *ci = ceph_inode(inode);
1930        const unsigned int ia_valid = attr->ia_valid;
1931        struct ceph_mds_request *req;
1932        struct ceph_mds_client *mdsc = ceph_sb_to_client(inode->i_sb)->mdsc;
1933        struct ceph_cap_flush *prealloc_cf;
1934        int issued;
1935        int release = 0, dirtied = 0;
1936        int mask = 0;
1937        int err = 0;
1938        int inode_dirty_flags = 0;
1939        bool lock_snap_rwsem = false;
1940
1941        prealloc_cf = ceph_alloc_cap_flush();
1942        if (!prealloc_cf)
1943                return -ENOMEM;
1944
1945        req = ceph_mdsc_create_request(mdsc, CEPH_MDS_OP_SETATTR,
1946                                       USE_AUTH_MDS);
1947        if (IS_ERR(req)) {
1948                ceph_free_cap_flush(prealloc_cf);
1949                return PTR_ERR(req);
1950        }
1951
1952        spin_lock(&ci->i_ceph_lock);
1953        issued = __ceph_caps_issued(ci, NULL);
1954
1955        if (!ci->i_head_snapc &&
1956            (issued & (CEPH_CAP_ANY_EXCL | CEPH_CAP_FILE_WR))) {
1957                lock_snap_rwsem = true;
1958                if (!down_read_trylock(&mdsc->snap_rwsem)) {
1959                        spin_unlock(&ci->i_ceph_lock);
1960                        down_read(&mdsc->snap_rwsem);
1961                        spin_lock(&ci->i_ceph_lock);
1962                        issued = __ceph_caps_issued(ci, NULL);
1963                }
1964        }
1965
1966        dout("setattr %p issued %s\n", inode, ceph_cap_string(issued));
1967
1968        if (ia_valid & ATTR_UID) {
1969                dout("setattr %p uid %d -> %d\n", inode,
1970                     from_kuid(&init_user_ns, inode->i_uid),
1971                     from_kuid(&init_user_ns, attr->ia_uid));
1972                if (issued & CEPH_CAP_AUTH_EXCL) {
1973                        inode->i_uid = attr->ia_uid;
1974                        dirtied |= CEPH_CAP_AUTH_EXCL;
1975                } else if ((issued & CEPH_CAP_AUTH_SHARED) == 0 ||
1976                           !uid_eq(attr->ia_uid, inode->i_uid)) {
1977                        req->r_args.setattr.uid = cpu_to_le32(
1978                                from_kuid(&init_user_ns, attr->ia_uid));
1979                        mask |= CEPH_SETATTR_UID;
1980                        release |= CEPH_CAP_AUTH_SHARED;
1981                }
1982        }
1983        if (ia_valid & ATTR_GID) {
1984                dout("setattr %p gid %d -> %d\n", inode,
1985                     from_kgid(&init_user_ns, inode->i_gid),
1986                     from_kgid(&init_user_ns, attr->ia_gid));
1987                if (issued & CEPH_CAP_AUTH_EXCL) {
1988                        inode->i_gid = attr->ia_gid;
1989                        dirtied |= CEPH_CAP_AUTH_EXCL;
1990                } else if ((issued & CEPH_CAP_AUTH_SHARED) == 0 ||
1991                           !gid_eq(attr->ia_gid, inode->i_gid)) {
1992                        req->r_args.setattr.gid = cpu_to_le32(
1993                                from_kgid(&init_user_ns, attr->ia_gid));
1994                        mask |= CEPH_SETATTR_GID;
1995                        release |= CEPH_CAP_AUTH_SHARED;
1996                }
1997        }
1998        if (ia_valid & ATTR_MODE) {
1999                dout("setattr %p mode 0%o -> 0%o\n", inode, inode->i_mode,
2000                     attr->ia_mode);
2001                if (issued & CEPH_CAP_AUTH_EXCL) {
2002                        inode->i_mode = attr->ia_mode;
2003                        dirtied |= CEPH_CAP_AUTH_EXCL;
2004                } else if ((issued & CEPH_CAP_AUTH_SHARED) == 0 ||
2005                           attr->ia_mode != inode->i_mode) {
2006                        inode->i_mode = attr->ia_mode;
2007                        req->r_args.setattr.mode = cpu_to_le32(attr->ia_mode);
2008                        mask |= CEPH_SETATTR_MODE;
2009                        release |= CEPH_CAP_AUTH_SHARED;
2010                }
2011        }
2012
2013        if (ia_valid & ATTR_ATIME) {
2014                dout("setattr %p atime %ld.%ld -> %ld.%ld\n", inode,
2015                     inode->i_atime.tv_sec, inode->i_atime.tv_nsec,
2016                     attr->ia_atime.tv_sec, attr->ia_atime.tv_nsec);
2017                if (issued & CEPH_CAP_FILE_EXCL) {
2018                        ci->i_time_warp_seq++;
2019                        inode->i_atime = attr->ia_atime;
2020                        dirtied |= CEPH_CAP_FILE_EXCL;
2021                } else if ((issued & CEPH_CAP_FILE_WR) &&
2022                           timespec_compare(&inode->i_atime,
2023                                            &attr->ia_atime) < 0) {
2024                        inode->i_atime = attr->ia_atime;
2025                        dirtied |= CEPH_CAP_FILE_WR;
2026                } else if ((issued & CEPH_CAP_FILE_SHARED) == 0 ||
2027                           !timespec_equal(&inode->i_atime, &attr->ia_atime)) {
2028                        ceph_encode_timespec(&req->r_args.setattr.atime,
2029                                             &attr->ia_atime);
2030                        mask |= CEPH_SETATTR_ATIME;
2031                        release |= CEPH_CAP_FILE_SHARED |
2032                                   CEPH_CAP_FILE_RD | CEPH_CAP_FILE_WR;
2033                }
2034        }
2035        if (ia_valid & ATTR_MTIME) {
2036                dout("setattr %p mtime %ld.%ld -> %ld.%ld\n", inode,
2037                     inode->i_mtime.tv_sec, inode->i_mtime.tv_nsec,
2038                     attr->ia_mtime.tv_sec, attr->ia_mtime.tv_nsec);
2039                if (issued & CEPH_CAP_FILE_EXCL) {
2040                        ci->i_time_warp_seq++;
2041                        inode->i_mtime = attr->ia_mtime;
2042                        dirtied |= CEPH_CAP_FILE_EXCL;
2043                } else if ((issued & CEPH_CAP_FILE_WR) &&
2044                           timespec_compare(&inode->i_mtime,
2045                                            &attr->ia_mtime) < 0) {
2046                        inode->i_mtime = attr->ia_mtime;
2047                        dirtied |= CEPH_CAP_FILE_WR;
2048                } else if ((issued & CEPH_CAP_FILE_SHARED) == 0 ||
2049                           !timespec_equal(&inode->i_mtime, &attr->ia_mtime)) {
2050                        ceph_encode_timespec(&req->r_args.setattr.mtime,
2051                                             &attr->ia_mtime);
2052                        mask |= CEPH_SETATTR_MTIME;
2053                        release |= CEPH_CAP_FILE_SHARED |
2054                                   CEPH_CAP_FILE_RD | CEPH_CAP_FILE_WR;
2055                }
2056        }
2057        if (ia_valid & ATTR_SIZE) {
2058                dout("setattr %p size %lld -> %lld\n", inode,
2059                     inode->i_size, attr->ia_size);
2060                if ((issued & CEPH_CAP_FILE_EXCL) &&
2061                    attr->ia_size > inode->i_size) {
2062                        i_size_write(inode, attr->ia_size);
2063                        inode->i_blocks = calc_inode_blocks(attr->ia_size);
2064                        ci->i_reported_size = attr->ia_size;
2065                        dirtied |= CEPH_CAP_FILE_EXCL;
2066                } else if ((issued & CEPH_CAP_FILE_SHARED) == 0 ||
2067                           attr->ia_size != inode->i_size) {
2068                        req->r_args.setattr.size = cpu_to_le64(attr->ia_size);
2069                        req->r_args.setattr.old_size =
2070                                cpu_to_le64(inode->i_size);
2071                        mask |= CEPH_SETATTR_SIZE;
2072                        release |= CEPH_CAP_FILE_SHARED | CEPH_CAP_FILE_EXCL |
2073                                   CEPH_CAP_FILE_RD | CEPH_CAP_FILE_WR;
2074                }
2075        }
2076
2077        /* these do nothing */
2078        if (ia_valid & ATTR_CTIME) {
2079                bool only = (ia_valid & (ATTR_SIZE|ATTR_MTIME|ATTR_ATIME|
2080                                         ATTR_MODE|ATTR_UID|ATTR_GID)) == 0;
2081                dout("setattr %p ctime %ld.%ld -> %ld.%ld (%s)\n", inode,
2082                     inode->i_ctime.tv_sec, inode->i_ctime.tv_nsec,
2083                     attr->ia_ctime.tv_sec, attr->ia_ctime.tv_nsec,
2084                     only ? "ctime only" : "ignored");
2085                if (only) {
2086                        /*
2087                         * if kernel wants to dirty ctime but nothing else,
2088                         * we need to choose a cap to dirty under, or do
2089                         * a almost-no-op setattr
2090                         */
2091                        if (issued & CEPH_CAP_AUTH_EXCL)
2092                                dirtied |= CEPH_CAP_AUTH_EXCL;
2093                        else if (issued & CEPH_CAP_FILE_EXCL)
2094                                dirtied |= CEPH_CAP_FILE_EXCL;
2095                        else if (issued & CEPH_CAP_XATTR_EXCL)
2096                                dirtied |= CEPH_CAP_XATTR_EXCL;
2097                        else
2098                                mask |= CEPH_SETATTR_CTIME;
2099                }
2100        }
2101        if (ia_valid & ATTR_FILE)
2102                dout("setattr %p ATTR_FILE ... hrm!\n", inode);
2103
2104        if (dirtied) {
2105                inode_dirty_flags = __ceph_mark_dirty_caps(ci, dirtied,
2106                                                           &prealloc_cf);
2107                inode->i_ctime = attr->ia_ctime;
2108        }
2109
2110        release &= issued;
2111        spin_unlock(&ci->i_ceph_lock);
2112        if (lock_snap_rwsem)
2113                up_read(&mdsc->snap_rwsem);
2114
2115        if (inode_dirty_flags)
2116                __mark_inode_dirty(inode, inode_dirty_flags);
2117
2118
2119        if (mask) {
2120                req->r_inode = inode;
2121                ihold(inode);
2122                req->r_inode_drop = release;
2123                req->r_args.setattr.mask = cpu_to_le32(mask);
2124                req->r_num_caps = 1;
2125                req->r_stamp = attr->ia_ctime;
2126                err = ceph_mdsc_do_request(mdsc, NULL, req);
2127        }
2128        dout("setattr %p result=%d (%s locally, %d remote)\n", inode, err,
2129             ceph_cap_string(dirtied), mask);
2130
2131        ceph_mdsc_put_request(req);
2132        ceph_free_cap_flush(prealloc_cf);
2133
2134        if (err >= 0 && (mask & CEPH_SETATTR_SIZE))
2135                __ceph_do_pending_vmtruncate(inode);
2136
2137        return err;
2138}
2139
2140/*
2141 * setattr
2142 */
2143int ceph_setattr(struct dentry *dentry, struct iattr *attr)
2144{
2145        struct inode *inode = d_inode(dentry);
2146        int err;
2147
2148        if (ceph_snap(inode) != CEPH_NOSNAP)
2149                return -EROFS;
2150
2151        err = setattr_prepare(dentry, attr);
2152        if (err != 0)
2153                return err;
2154
2155        err = __ceph_setattr(inode, attr);
2156
2157        if (err >= 0 && (attr->ia_valid & ATTR_MODE))
2158                err = posix_acl_chmod(inode, attr->ia_mode);
2159
2160        return err;
2161}
2162
2163/*
2164 * Verify that we have a lease on the given mask.  If not,
2165 * do a getattr against an mds.
2166 */
2167int __ceph_do_getattr(struct inode *inode, struct page *locked_page,
2168                      int mask, bool force)
2169{
2170        struct ceph_fs_client *fsc = ceph_sb_to_client(inode->i_sb);
2171        struct ceph_mds_client *mdsc = fsc->mdsc;
2172        struct ceph_mds_request *req;
2173        int err;
2174
2175        if (ceph_snap(inode) == CEPH_SNAPDIR) {
2176                dout("do_getattr inode %p SNAPDIR\n", inode);
2177                return 0;
2178        }
2179
2180        dout("do_getattr inode %p mask %s mode 0%o\n",
2181             inode, ceph_cap_string(mask), inode->i_mode);
2182        if (!force && ceph_caps_issued_mask(ceph_inode(inode), mask, 1))
2183                return 0;
2184
2185        req = ceph_mdsc_create_request(mdsc, CEPH_MDS_OP_GETATTR, USE_ANY_MDS);
2186        if (IS_ERR(req))
2187                return PTR_ERR(req);
2188        req->r_inode = inode;
2189        ihold(inode);
2190        req->r_num_caps = 1;
2191        req->r_args.getattr.mask = cpu_to_le32(mask);
2192        req->r_locked_page = locked_page;
2193        err = ceph_mdsc_do_request(mdsc, NULL, req);
2194        if (locked_page && err == 0) {
2195                u64 inline_version = req->r_reply_info.targeti.inline_version;
2196                if (inline_version == 0) {
2197                        /* the reply is supposed to contain inline data */
2198                        err = -EINVAL;
2199                } else if (inline_version == CEPH_INLINE_NONE) {
2200                        err = -ENODATA;
2201                } else {
2202                        err = req->r_reply_info.targeti.inline_len;
2203                }
2204        }
2205        ceph_mdsc_put_request(req);
2206        dout("do_getattr result=%d\n", err);
2207        return err;
2208}
2209
2210
2211/*
2212 * Check inode permissions.  We verify we have a valid value for
2213 * the AUTH cap, then call the generic handler.
2214 */
2215int ceph_permission(struct inode *inode, int mask)
2216{
2217        int err;
2218
2219        if (mask & MAY_NOT_BLOCK)
2220                return -ECHILD;
2221
2222        err = ceph_do_getattr(inode, CEPH_CAP_AUTH_SHARED, false);
2223
2224        if (!err)
2225                err = generic_permission(inode, mask);
2226        return err;
2227}
2228
2229/*
2230 * Get all attributes.  Hopefully somedata we'll have a statlite()
2231 * and can limit the fields we require to be accurate.
2232 */
2233int ceph_getattr(const struct path *path, struct kstat *stat,
2234                 u32 request_mask, unsigned int flags)
2235{
2236        struct inode *inode = d_inode(path->dentry);
2237        struct ceph_inode_info *ci = ceph_inode(inode);
2238        int err;
2239
2240        err = ceph_do_getattr(inode, CEPH_STAT_CAP_INODE_ALL, false);
2241        if (!err) {
2242                generic_fillattr(inode, stat);
2243                stat->ino = ceph_translate_ino(inode->i_sb, inode->i_ino);
2244                if (ceph_snap(inode) != CEPH_NOSNAP)
2245                        stat->dev = ceph_snap(inode);
2246                else
2247                        stat->dev = 0;
2248                if (S_ISDIR(inode->i_mode)) {
2249                        if (ceph_test_mount_opt(ceph_sb_to_client(inode->i_sb),
2250                                                RBYTES))
2251                                stat->size = ci->i_rbytes;
2252                        else
2253                                stat->size = ci->i_files + ci->i_subdirs;
2254                        stat->blocks = 0;
2255                        stat->blksize = 65536;
2256                }
2257        }
2258        return err;
2259}
2260