]> Pileus Git - ~andy/linux/commitdiff
Merge branch 'for-2.6.40/drivers' of git://git.kernel.dk/linux-2.6-block
authorLinus Torvalds <torvalds@linux-foundation.org>
Wed, 25 May 2011 16:15:35 +0000 (09:15 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Wed, 25 May 2011 16:15:35 +0000 (09:15 -0700)
* 'for-2.6.40/drivers' of git://git.kernel.dk/linux-2.6-block: (110 commits)
  loop: handle on-demand devices correctly
  loop: limit 'max_part' module param to DISK_MAX_PARTS
  drbd: fix warning
  drbd: fix warning
  drbd: Fix spelling
  drbd: fix schedule in atomic
  drbd: Take a more conservative approach when deciding max_bio_size
  drbd: Fixed state transitions after async outdate-peer-handler returned
  drbd: Disallow the peer_disk_state to be D_OUTDATED while connected
  drbd: Fix for the connection problems on high latency links
  drbd: fix potential activity log refcount imbalance in error path
  drbd: Only downgrade the disk state in case of disk failures
  drbd: fix disconnect/reconnect loop, if ping-timeout == ping-int
  drbd: fix potential distributed deadlock
  lru_cache.h: fix comments referring to ts_ instead of lc_
  drbd: Fix for application IO with the on-io-error=pass-on policy
  xen/p2m: Add EXPORT_SYMBOL_GPL to the M2P override functions.
  xen/p2m/m2p/gnttab: Support GNTMAP_host_map in the M2P override.
  xen/blkback: don't fail empty barrier requests
  xen/blkback: fix xenbus_transaction_start() hang caused by double xenbus_transaction_end()
  ...

1  2 
drivers/block/drbd/drbd_int.h

index d871b14ed5a186a22d758308f1a498fbfe66de26,b127f8d25b0b09c8edd2b9a935d36429f77903aa..ef2ceed3be4b2767f6b3886a48a002609597e2e8
@@@ -42,7 -42,6 +42,7 @@@
  #include <linux/genhd.h>
  #include <net/tcp.h>
  #include <linux/lru_cache.h>
 +#include <linux/prefetch.h>
  
  #ifdef __CHECKER__
  # define __protected_by(x)       __attribute__((require_context(x,1,999,"rdwr")))
@@@ -700,7 -699,7 +700,7 @@@ struct drbd_request 
         * see drbd_endio_pri(). */
        struct bio *private_bio;
  
-       struct hlist_node colision;
+       struct hlist_node collision;
        sector_t sector;
        unsigned int size;
        unsigned int epoch; /* barrier_nr */
@@@ -766,7 -765,7 +766,7 @@@ struct digest_info 
  
  struct drbd_epoch_entry {
        struct drbd_work w;
-       struct hlist_node colision;
+       struct hlist_node collision;
        struct drbd_epoch *epoch; /* for writes */
        struct drbd_conf *mdev;
        struct page *pages;
@@@ -1129,6 -1128,8 +1129,8 @@@ struct drbd_conf 
        int rs_in_flight; /* resync sectors in flight (to proxy, in proxy and from proxy) */
        int rs_planed;    /* resync sectors already planned */
        atomic_t ap_in_flight; /* App sectors in flight (waiting for ack) */
+       int peer_max_bio_size;
+       int local_max_bio_size;
  };
  
  static inline struct drbd_conf *minor_to_mdev(unsigned int minor)
@@@ -1218,8 -1219,6 +1220,6 @@@ extern void drbd_free_resources(struct 
  extern void tl_release(struct drbd_conf *mdev, unsigned int barrier_nr,
                       unsigned int set_size);
  extern void tl_clear(struct drbd_conf *mdev);
- enum drbd_req_event;
- extern void tl_restart(struct drbd_conf *mdev, enum drbd_req_event what);
  extern void _tl_add_barrier(struct drbd_conf *, struct drbd_tl_epoch *);
  extern void drbd_free_sock(struct drbd_conf *mdev);
  extern int drbd_send(struct drbd_conf *mdev, struct socket *sock,
@@@ -1434,6 -1433,7 +1434,7 @@@ struct bm_extent 
   * hash table. */
  #define HT_SHIFT 8
  #define DRBD_MAX_BIO_SIZE (1U<<(9+HT_SHIFT))
+ #define DRBD_MAX_BIO_SIZE_SAFE (1 << 12)       /* Works always = 4k */
  
  #define DRBD_MAX_SIZE_H80_PACKET (1 << 15) /* The old header only allows packets up to 32Kib data */
  
@@@ -1518,9 -1518,9 +1519,9 @@@ extern void drbd_resume_io(struct drbd_
  extern char *ppsize(char *buf, unsigned long long size);
  extern sector_t drbd_new_dev_size(struct drbd_conf *, struct drbd_backing_dev *, int);
  enum determine_dev_size { dev_size_error = -1, unchanged = 0, shrunk = 1, grew = 2 };
- extern enum determine_dev_size drbd_determin_dev_size(struct drbd_conf *, enum dds_flags) __must_hold(local);
+ extern enum determine_dev_size drbd_determine_dev_size(struct drbd_conf *, enum dds_flags) __must_hold(local);
  extern void resync_after_online_grow(struct drbd_conf *);
- extern void drbd_setup_queue_param(struct drbd_conf *mdev, unsigned int) __must_hold(local);
+ extern void drbd_reconsider_max_bio_size(struct drbd_conf *mdev);
  extern enum drbd_state_rv drbd_set_role(struct drbd_conf *mdev,
                                        enum drbd_role new_role,
                                        int force);
@@@ -1828,6 -1828,8 +1829,8 @@@ static inline void __drbd_chk_io_error_
                if (!forcedetach) {
                        if (__ratelimit(&drbd_ratelimit_state))
                                dev_err(DEV, "Local IO failed in %s.\n", where);
+                       if (mdev->state.disk > D_INCONSISTENT)
+                               _drbd_set_state(_NS(mdev, disk, D_INCONSISTENT), CS_HARD, NULL);
                        break;
                }
                /* NOTE fall through to detach case if forcedetach set */
@@@ -2153,6 -2155,10 +2156,10 @@@ static inline int get_net_conf(struct d
  static inline void put_ldev(struct drbd_conf *mdev)
  {
        int i = atomic_dec_return(&mdev->local_cnt);
+       /* This may be called from some endio handler,
+        * so we must not sleep here. */
        __release(local);
        D_ASSERT(i >= 0);
        if (i == 0) {