Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

dm snapshot: allocate a per-target structure for snapshot-origin target

Allocate a per-target dm_origin structure. This is a prerequisite for
the next commit ("dm snapshot: do not split read bios sent to
snapshot-origin target") which adds a new member to this structure.

Signed-off-by: Mikulas Patocka <mpatocka@redhat.com>
Signed-off-by: Mike Snitzer <snitzer@redhat.com>

authored by

Mikulas Patocka and committed by
Mike Snitzer
599cdf3b 1dd40c3e

+37 -20
+37 -20
drivers/md/dm-snap.c
··· 2141 2141 * Origin: maps a linear range of a device, with hooks for snapshotting. 2142 2142 */ 2143 2143 2144 + struct dm_origin { 2145 + struct dm_dev *dev; 2146 + }; 2147 + 2144 2148 /* 2145 2149 * Construct an origin mapping: <dev_path> 2146 2150 * The context for an origin is merely a 'struct dm_dev *' ··· 2153 2149 static int origin_ctr(struct dm_target *ti, unsigned int argc, char **argv) 2154 2150 { 2155 2151 int r; 2156 - struct dm_dev *dev; 2152 + struct dm_origin *o; 2157 2153 2158 2154 if (argc != 1) { 2159 2155 ti->error = "origin: incorrect number of arguments"; 2160 2156 return -EINVAL; 2161 2157 } 2162 2158 2163 - r = dm_get_device(ti, argv[0], dm_table_get_mode(ti->table), &dev); 2164 - if (r) { 2165 - ti->error = "Cannot get target device"; 2166 - return r; 2159 + o = kmalloc(sizeof(struct dm_origin), GFP_KERNEL); 2160 + if (!o) { 2161 + ti->error = "Cannot allocate private origin structure"; 2162 + r = -ENOMEM; 2163 + goto bad_alloc; 2167 2164 } 2168 2165 2169 - ti->private = dev; 2166 + r = dm_get_device(ti, argv[0], dm_table_get_mode(ti->table), &o->dev); 2167 + if (r) { 2168 + ti->error = "Cannot get target device"; 2169 + goto bad_open; 2170 + } 2171 + 2172 + ti->private = o; 2170 2173 ti->num_flush_bios = 1; 2171 2174 2172 2175 return 0; 2176 + 2177 + bad_open: 2178 + kfree(o); 2179 + bad_alloc: 2180 + return r; 2173 2181 } 2174 2182 2175 2183 static void origin_dtr(struct dm_target *ti) 2176 2184 { 2177 - struct dm_dev *dev = ti->private; 2178 - dm_put_device(ti, dev); 2185 + struct dm_origin *o = ti->private; 2186 + dm_put_device(ti, o->dev); 2187 + kfree(o); 2179 2188 } 2180 2189 2181 2190 static int origin_map(struct dm_target *ti, struct bio *bio) 2182 2191 { 2183 - struct dm_dev *dev = ti->private; 2184 - bio->bi_bdev = dev->bdev; 2192 + struct dm_origin *o = ti->private; 2193 + bio->bi_bdev = o->dev->bdev; 2185 2194 2186 2195 if (bio->bi_rw & REQ_FLUSH) 2187 2196 return DM_MAPIO_REMAPPED; 2188 2197 2189 2198 /* Only tell snapshots if this is a write */ 2190 - return (bio_rw(bio) == WRITE) ? do_origin(dev, bio) : DM_MAPIO_REMAPPED; 2199 + return (bio_rw(bio) == WRITE) ? do_origin(o->dev, bio) : DM_MAPIO_REMAPPED; 2191 2200 } 2192 2201 2193 2202 /* ··· 2209 2192 */ 2210 2193 static void origin_resume(struct dm_target *ti) 2211 2194 { 2212 - struct dm_dev *dev = ti->private; 2195 + struct dm_origin *o = ti->private; 2213 2196 2214 - ti->max_io_len = get_origin_minimum_chunksize(dev->bdev); 2197 + ti->max_io_len = get_origin_minimum_chunksize(o->dev->bdev); 2215 2198 } 2216 2199 2217 2200 static void origin_status(struct dm_target *ti, status_type_t type, 2218 2201 unsigned status_flags, char *result, unsigned maxlen) 2219 2202 { 2220 - struct dm_dev *dev = ti->private; 2203 + struct dm_origin *o = ti->private; 2221 2204 2222 2205 switch (type) { 2223 2206 case STATUSTYPE_INFO: ··· 2225 2208 break; 2226 2209 2227 2210 case STATUSTYPE_TABLE: 2228 - snprintf(result, maxlen, "%s", dev->name); 2211 + snprintf(result, maxlen, "%s", o->dev->name); 2229 2212 break; 2230 2213 } 2231 2214 } ··· 2233 2216 static int origin_merge(struct dm_target *ti, struct bvec_merge_data *bvm, 2234 2217 struct bio_vec *biovec, int max_size) 2235 2218 { 2236 - struct dm_dev *dev = ti->private; 2237 - struct request_queue *q = bdev_get_queue(dev->bdev); 2219 + struct dm_origin *o = ti->private; 2220 + struct request_queue *q = bdev_get_queue(o->dev->bdev); 2238 2221 2239 2222 if (!q->merge_bvec_fn) 2240 2223 return max_size; 2241 2224 2242 - bvm->bi_bdev = dev->bdev; 2225 + bvm->bi_bdev = o->dev->bdev; 2243 2226 2244 2227 return min(max_size, q->merge_bvec_fn(q, bvm, biovec)); 2245 2228 } ··· 2247 2230 static int origin_iterate_devices(struct dm_target *ti, 2248 2231 iterate_devices_callout_fn fn, void *data) 2249 2232 { 2250 - struct dm_dev *dev = ti->private; 2233 + struct dm_origin *o = ti->private; 2251 2234 2252 - return fn(ti, dev, 0, ti->len, data); 2235 + return fn(ti, o->dev, 0, ti->len, data); 2253 2236 } 2254 2237 2255 2238 static struct target_type origin_target = {