Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/sage/ceph...
authorLinus Torvalds <torvalds@linux-foundation.org>
Fri, 11 Sep 2015 19:33:03 +0000 (12:33 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Fri, 11 Sep 2015 19:33:03 +0000 (12:33 -0700)
Pull Ceph update from Sage Weil:
 "There are a few fixes for snapshot behavior with CephFS and support
  for the new keepalive protocol from Zheng, a libceph fix that affects
  both RBD and CephFS, a few bug fixes and cleanups for RBD from Ilya,
  and several small fixes and cleanups from Jianpeng and others"

* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/sage/ceph-client:
  ceph: improve readahead for file holes
  ceph: get inode size for each append write
  libceph: check data_len in ->alloc_msg()
  libceph: use keepalive2 to verify the mon session is alive
  rbd: plug rbd_dev->header.object_prefix memory leak
  rbd: fix double free on rbd_dev->header_name
  libceph: set 'exists' flag for newly up osd
  ceph: cleanup use of ceph_msg_get
  ceph: no need to get parent inode in ceph_open
  ceph: remove the useless judgement
  ceph: remove redundant test of head->safe and silence static analysis warnings
  ceph: fix queuing inode to mdsdir's snaprealm
  libceph: rename con_work() to ceph_con_workfn()
  libceph: Avoid holding the zero page on ceph_msgr_slab_init errors
  libceph: remove the unused macro AES_KEY_SIZE
  ceph: invalidate dirty pages after forced umount
  ceph: EIO all operations after forced umount

1  2 
drivers/block/rbd.c
fs/ceph/addr.c
fs/ceph/super.c
net/ceph/ceph_common.c

diff --combined drivers/block/rbd.c
index 698f761037ce54a6c94be1aeaf0a6179e4c9735b,69d03aa46d0dbbc16fbd0d6b07a7c7c0026fb374..d93a0372b37b5c7b4cb214e7013e64897c3a9aba
@@@ -3474,6 -3474,52 +3474,6 @@@ static int rbd_queue_rq(struct blk_mq_h
        return BLK_MQ_RQ_QUEUE_OK;
  }
  
 -/*
 - * a queue callback. Makes sure that we don't create a bio that spans across
 - * multiple osd objects. One exception would be with a single page bios,
 - * which we handle later at bio_chain_clone_range()
 - */
 -static int rbd_merge_bvec(struct request_queue *q, struct bvec_merge_data *bmd,
 -                        struct bio_vec *bvec)
 -{
 -      struct rbd_device *rbd_dev = q->queuedata;
 -      sector_t sector_offset;
 -      sector_t sectors_per_obj;
 -      sector_t obj_sector_offset;
 -      int ret;
 -
 -      /*
 -       * Find how far into its rbd object the partition-relative
 -       * bio start sector is to offset relative to the enclosing
 -       * device.
 -       */
 -      sector_offset = get_start_sect(bmd->bi_bdev) + bmd->bi_sector;
 -      sectors_per_obj = 1 << (rbd_dev->header.obj_order - SECTOR_SHIFT);
 -      obj_sector_offset = sector_offset & (sectors_per_obj - 1);
 -
 -      /*
 -       * Compute the number of bytes from that offset to the end
 -       * of the object.  Account for what's already used by the bio.
 -       */
 -      ret = (int) (sectors_per_obj - obj_sector_offset) << SECTOR_SHIFT;
 -      if (ret > bmd->bi_size)
 -              ret -= bmd->bi_size;
 -      else
 -              ret = 0;
 -
 -      /*
 -       * Don't send back more than was asked for.  And if the bio
 -       * was empty, let the whole thing through because:  "Note
 -       * that a block device *must* allow a single page to be
 -       * added to an empty bio."
 -       */
 -      rbd_assert(bvec->bv_len <= PAGE_SIZE);
 -      if (ret > (int) bvec->bv_len || !bmd->bi_size)
 -              ret = (int) bvec->bv_len;
 -
 -      return ret;
 -}
 -
  static void rbd_free_disk(struct rbd_device *rbd_dev)
  {
        struct gendisk *disk = rbd_dev->disk;
@@@ -3769,9 -3815,10 +3769,9 @@@ static int rbd_init_disk(struct rbd_dev
        queue_flag_set_unlocked(QUEUE_FLAG_DISCARD, q);
        q->limits.discard_granularity = segment_size;
        q->limits.discard_alignment = segment_size;
 -      q->limits.max_discard_sectors = segment_size / SECTOR_SIZE;
 +      blk_queue_max_discard_sectors(q, segment_size / SECTOR_SIZE);
        q->limits.discard_zeroes_data = 1;
  
 -      blk_queue_merge_bvec(q, rbd_merge_bvec);
        disk->queue = q;
  
        q->queuedata = rbd_dev;
@@@ -4673,7 -4720,10 +4673,10 @@@ static int rbd_dev_v2_header_info(struc
        }
  
        ret = rbd_dev_v2_snap_context(rbd_dev);
-       dout("rbd_dev_v2_snap_context returned %d\n", ret);
+       if (ret && first_time) {
+               kfree(rbd_dev->header.object_prefix);
+               rbd_dev->header.object_prefix = NULL;
+       }
  
        return ret;
  }
@@@ -5154,7 -5204,6 +5157,6 @@@ static int rbd_dev_probe_parent(struct 
  out_err:
        if (parent) {
                rbd_dev_unparent(rbd_dev);
-               kfree(rbd_dev->header_name);
                rbd_dev_destroy(parent);
        } else {
                rbd_put_client(rbdc);
diff --combined fs/ceph/addr.c
index a268abfe60acd53d034b89d53139064ecaa687ac,6471e28e0586b443513fb5261d951d521464359b..9d23e788d1dfdab235d1edd0f8d1d3e065904e65
@@@ -276,7 -276,7 +276,7 @@@ static void finish_read(struct ceph_osd
        for (i = 0; i < num_pages; i++) {
                struct page *page = osd_data->pages[i];
  
-               if (rc < 0)
+               if (rc < 0 && rc != ENOENT)
                        goto unlock;
                if (bytes < (int)PAGE_CACHE_SIZE) {
                        /* zero (remainder of) page */
@@@ -717,8 -717,10 +717,10 @@@ static int ceph_writepages_start(struc
             wbc->sync_mode == WB_SYNC_NONE ? "NONE" :
             (wbc->sync_mode == WB_SYNC_ALL ? "ALL" : "HOLD"));
  
-       if (fsc->mount_state == CEPH_MOUNT_SHUTDOWN) {
+       if (ACCESS_ONCE(fsc->mount_state) == CEPH_MOUNT_SHUTDOWN) {
                pr_warn("writepage_start %p on forced umount\n", inode);
+               truncate_pagecache(inode, 0);
+               mapping_set_error(mapping, -EIO);
                return -EIO; /* we're in a forced umount, don't write! */
        }
        if (fsc->mount_options->wsize && fsc->mount_options->wsize < wsize)
@@@ -1593,7 -1595,7 +1595,7 @@@ out
        return err;
  }
  
 -static struct vm_operations_struct ceph_vmops = {
 +static const struct vm_operations_struct ceph_vmops = {
        .fault          = ceph_filemap_fault,
        .page_mkwrite   = ceph_page_mkwrite,
  };
diff --combined fs/ceph/super.c
index 7b6bfcbf801cac7bf5c54f4543809c1bb6c76d87,69e6e19bcfc172d44d3cb1c369947172222fe4c3..f446afada328a45c2b70f648cbb48261e11e996c
@@@ -479,7 -479,7 +479,7 @@@ static int ceph_show_options(struct seq
        if (fsopt->max_readdir_bytes != CEPH_MAX_READDIR_BYTES_DEFAULT)
                seq_printf(m, ",readdir_max_bytes=%d", fsopt->max_readdir_bytes);
        if (strcmp(fsopt->snapdir_name, CEPH_SNAPDIRNAME_DEFAULT))
 -              seq_printf(m, ",snapdirname=%s", fsopt->snapdir_name);
 +              seq_show_option(m, "snapdirname", fsopt->snapdir_name);
  
        return 0;
  }
@@@ -708,6 -708,7 +708,7 @@@ static void ceph_umount_begin(struct su
        if (!fsc)
                return;
        fsc->mount_state = CEPH_MOUNT_SHUTDOWN;
+       ceph_mdsc_force_umount(fsc->mdsc);
        return;
  }
  
diff --combined net/ceph/ceph_common.c
index 69a4d30a9ccf44900961e0691d942acfb4262201,3f56eefc2a073e9510bea7c4a8637009e1503466..54a00d66509e748d47068a664bc14585166cbd97
@@@ -357,6 -357,7 +357,7 @@@ ceph_parse_options(char *options, cons
        opt->osd_keepalive_timeout = CEPH_OSD_KEEPALIVE_DEFAULT;
        opt->mount_timeout = CEPH_MOUNT_TIMEOUT_DEFAULT;
        opt->osd_idle_ttl = CEPH_OSD_IDLE_TTL_DEFAULT;
+       opt->monc_ping_timeout = CEPH_MONC_PING_TIMEOUT_DEFAULT;
  
        /* get mon ip(s) */
        /* ip1[:port1][,ip2[:port2]...] */
@@@ -517,11 -518,8 +518,11 @@@ int ceph_print_client_options(struct se
        struct ceph_options *opt = client->options;
        size_t pos = m->count;
  
 -      if (opt->name)
 -              seq_printf(m, "name=%s,", opt->name);
 +      if (opt->name) {
 +              seq_puts(m, "name=");
 +              seq_escape(m, opt->name, ", \t\n\\");
 +              seq_putc(m, ',');
 +      }
        if (opt->key)
                seq_puts(m, "secret=<hidden>,");