__u8 obj_order;
        __u8 crypt_type;
        __u8 comp_type;
-       struct rw_semaphore snap_rwsem;
        struct ceph_snap_context *snapc;
        size_t snap_names_len;
        u64 snap_seq;
        struct ceph_osd_event   *watch_event;
        struct ceph_osd_request *watch_request;
 
+       /* protects updating the header */
+       struct rw_semaphore     header_rwsem;
        char                    snap_name[RBD_MAX_SNAP_NAME_LEN];
        u32 cur_snap;   /* index+1 of current snapshot within snap context
                           0 - for the head */
        if (!header->snapc)
                return -ENOMEM;
 
-       init_rwsem(&header->snap_rwsem);
        header->snap_names_len = le64_to_cpu(ondisk->snap_names_len);
        if (snap_count) {
                header->snap_names = kmalloc(header->snap_names_len,
 
        BUILD_BUG_ON(sizeof (dev->snap_name) < sizeof (RBD_SNAP_HEAD_NAME));
 
-       down_write(&header->snap_rwsem);
+       down_write(&dev->header_rwsem);
 
        if (!memcmp(dev->snap_name, RBD_SNAP_HEAD_NAME,
                    sizeof (RBD_SNAP_HEAD_NAME))) {
 
        ret = 0;
 done:
-       up_write(&header->snap_rwsem);
+       up_write(&dev->header_rwsem);
        return ret;
 }
 
        struct timespec mtime = CURRENT_TIME;
        struct rbd_request *req_data;
        struct ceph_osd_request_head *reqhead;
-       struct rbd_image_header *header = &dev->header;
        struct ceph_osd_client *osdc;
 
        req_data = kzalloc(sizeof(*req_data), GFP_NOIO);
 
        dout("rbd_do_request obj=%s ofs=%lld len=%lld\n", obj, len, ofs);
 
-       down_read(&header->snap_rwsem);
+       down_read(&dev->header_rwsem);
 
        osdc = &dev->rbd_client->client->osdc;
        req = ceph_osdc_alloc_request(osdc, flags, snapc, ops,
                                        false, GFP_NOIO, pages, bio);
        if (!req) {
-               up_read(&header->snap_rwsem);
+               up_read(&dev->header_rwsem);
                ret = -ENOMEM;
                goto done_pages;
        }
                                snapc,
                                &mtime,
                                req->r_oid, req->r_oid_len);
-       up_read(&header->snap_rwsem);
+       up_read(&dev->header_rwsem);
 
        if (linger_req) {
                ceph_osdc_set_request_linger(osdc, req);
        /* resized? */
        set_capacity(rbd_dev->disk, h.image_size / SECTOR_SIZE);
 
-       down_write(&rbd_dev->header.snap_rwsem);
+       down_write(&rbd_dev->header_rwsem);
 
        snap_seq = rbd_dev->header.snapc->seq;
        if (rbd_dev->header.total_snaps &&
 
        ret = __rbd_init_snaps_header(rbd_dev);
 
-       up_write(&rbd_dev->header.snap_rwsem);
+       up_write(&rbd_dev->header_rwsem);
 
        return ret;
 }
        spin_lock_init(&rbd_dev->lock);
        INIT_LIST_HEAD(&rbd_dev->node);
        INIT_LIST_HEAD(&rbd_dev->snaps);
+       init_rwsem(&rbd_dev->header_rwsem);
 
-       init_rwsem(&rbd_dev->header.snap_rwsem);
+       init_rwsem(&rbd_dev->header_rwsem);
 
        /* generate unique id: find highest unique id, add one */
        rbd_id_get(rbd_dev);