Subject: [PATCH] md:change resync_mismatches to atomic64_t to avoid races
[deliverable/linux.git] / drivers / md / md.h
index 7b4a3c318cae437ecb2041c33b2bdcee2c66bf15..af443ab868db910f2db2d35d53ffacca701f1e60 100644 (file)
@@ -266,9 +266,6 @@ struct mddev {
        int                             new_chunk_sectors;
        int                             reshape_backwards;
 
-       atomic_t                        plug_cnt;       /* If device is expecting
-                                                        * more bios soon.
-                                                        */
        struct md_thread                *thread;        /* management thread */
        struct md_thread                *sync_thread;   /* doing resync or reconstruct */
        sector_t                        curr_resync;    /* last block scheduled */
@@ -285,7 +282,7 @@ struct mddev {
 
        sector_t                        resync_max_sectors; /* may be set by personality */
 
-       sector_t                        resync_mismatches; /* count of sectors where
+       atomic64_t                      resync_mismatches; /* count of sectors where
                                                            * parity/replica mismatch found
                                                            */
 
@@ -543,12 +540,13 @@ static inline void sysfs_unlink_rdev(struct mddev *mddev, struct md_rdev *rdev)
        list_for_each_entry_rcu(rdev, &((mddev)->disks), same_set)
 
 struct md_thread {
-       void                    (*run) (struct mddev *mddev);
+       void                    (*run) (struct md_thread *thread);
        struct mddev            *mddev;
        wait_queue_head_t       wqueue;
        unsigned long           flags;
        struct task_struct      *tsk;
        unsigned long           timeout;
+       void                    *private;
 };
 
 #define THREAD_WAKEUP  0
@@ -587,7 +585,7 @@ static inline void safe_put_page(struct page *p)
 extern int register_md_personality(struct md_personality *p);
 extern int unregister_md_personality(struct md_personality *p);
 extern struct md_thread *md_register_thread(
-       void (*run)(struct mddev *mddev),
+       void (*run)(struct md_thread *thread),
        struct mddev *mddev,
        const char *name);
 extern void md_unregister_thread(struct md_thread **threadp);
@@ -606,7 +604,7 @@ extern void md_super_write(struct mddev *mddev, struct md_rdev *rdev,
 extern void md_super_wait(struct mddev *mddev);
 extern int sync_page_io(struct md_rdev *rdev, sector_t sector, int size, 
                        struct page *page, int rw, bool metadata_op);
-extern void md_do_sync(struct mddev *mddev);
+extern void md_do_sync(struct md_thread *thread);
 extern void md_new_event(struct mddev *mddev);
 extern int md_allow_write(struct mddev *mddev);
 extern void md_wait_for_blocked_rdev(struct md_rdev *rdev, struct mddev *mddev);
@@ -630,6 +628,12 @@ extern struct bio *bio_clone_mddev(struct bio *bio, gfp_t gfp_mask,
                                   struct mddev *mddev);
 extern struct bio *bio_alloc_mddev(gfp_t gfp_mask, int nr_iovecs,
                                   struct mddev *mddev);
-extern int mddev_check_plugged(struct mddev *mddev);
 extern void md_trim_bio(struct bio *bio, int offset, int size);
+
+extern void md_unplug(struct blk_plug_cb *cb, bool from_schedule);
+static inline int mddev_check_plugged(struct mddev *mddev)
+{
+       return !!blk_check_plugged(md_unplug, mddev,
+                                  sizeof(struct blk_plug_cb));
+}
 #endif /* _MD_MD_H */
This page took 0.025445 seconds and 5 git commands to generate.