aboutsummaryrefslogtreecommitdiffstats
path: root/fs/nfs/direct.c
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2012-06-01 13:12:15 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2012-06-01 13:12:15 -0400
commit4edebed86690eb8db9af3ab85baf4a34e73266cc (patch)
tree8ab144b08f490f239fa62be52470860c9311664d /fs/nfs/direct.c
parent51eab603f5c86dd1eae4c525df3e7f7eeab401d6 (diff)
parent5e44f8c374dc4f8eadf61cd18b2c0d46bc87c1b7 (diff)
Merge tag 'ext4_for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tytso/ext4
Pull Ext4 updates from Theodore Ts'o: "The major new feature added in this update is Darrick J Wong's metadata checksum feature, which adds crc32 checksums to ext4's metadata fields. There is also the usual set of cleanups and bug fixes." * tag 'ext4_for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tytso/ext4: (44 commits) ext4: hole-punch use truncate_pagecache_range jbd2: use kmem_cache_zalloc wrapper instead of flag ext4: remove mb_groups before tearing down the buddy_cache ext4: add ext4_mb_unload_buddy in the error path ext4: don't trash state flags in EXT4_IOC_SETFLAGS ext4: let getattr report the right blocks in delalloc+bigalloc ext4: add missing save_error_info() to ext4_error() ext4: add debugging trigger for ext4_error() ext4: protect group inode free counting with group lock ext4: use consistent ssize_t type in ext4_file_write() ext4: fix format flag in ext4_ext_binsearch_idx() ext4: cleanup in ext4_discard_allocated_blocks() ext4: return ENOMEM when mounts fail due to lack of memory ext4: remove redundundant "(char *) bh->b_data" casts ext4: disallow hard-linked directory in ext4_lookup ext4: fix potential integer overflow in alloc_flex_gd() ext4: remove needs_recovery in ext4_mb_init() ext4: force ro mount if ext4_setup_super() fails ext4: fix potential NULL dereference in ext4_free_inodes_counts() ext4/jbd2: add metadata checksumming to the list of supported features ...
Diffstat (limited to 'fs/nfs/direct.c')
0 files changed, 0 insertions, 0 deletions
gi/litmus-rt-ext-res.git/commit/drivers/md/linear.c?id=5c675f83c68fbdf9c0e103c1090b06be747fa62c'>5c675f83c68f
26be34dc3a46
e849b9381f72
26be34dc3a46

6f9c02ab9d0d

af11c397fd88
6f9c02ab9d0d
165125e1e480
26be34dc3a46

af11c397fd88
6f9c02ab9d0d
26be34dc3a46


fd01b88c75a7
80c3a6ce4ba4
e849b9381f72
af11c397fd88
80c3a6ce4ba4
3be260cc18f8
80c3a6ce4ba4

af11c397fd88
80c3a6ce4ba4
af11c397fd88
80c3a6ce4ba4

e849b9381f72
1da177e4c3f4
e849b9381f72
3cb03002000f
45d4582f2196
f1cad2b68ed1
1da177e4c3f4
a71207713a36
1da177e4c3f4

7c7546ccf646

1da177e4c3f4
d6e221505281
1da177e4c3f4
dafb20fa3432
1da177e4c3f4
a71207713a36
13f2682b7216
1da177e4c3f4
13864515f7bf
2dc40f80945a

1da177e4c3f4



13f2682b7216




1da177e4c3f4
8f6c2e4b325a

1da177e4c3f4
dd8ac336c13f
1da177e4c3f4
4db7cdc859f5
f1cad2b68ed1

1da177e4c3f4
7c7546ccf646
2dc40f80945a

1da177e4c3f4


f1cad2b68ed1




1da177e4c3f4
45d4582f2196
1da177e4c3f4
4db7cdc859f5

a778b73ff793
4db7cdc859f5


15945fee6f09
6f9c02ab9d0d












7c7546ccf646






fd01b88c75a7
7c7546ccf646
e849b9381f72
98d5561bfbc3
7c7546ccf646
0894cc3066aa

7c7546ccf646




1f403624bde3
7c7546ccf646
98d5561bfbc3





7c7546ccf646
1da177e4c3f4
fd01b88c75a7
7c7546ccf646








e849b9381f72
7c7546ccf646
a778b73ff793
7c7546ccf646

a778b73ff793
09cd9270ea52
a778b73ff793
7c7546ccf646




6f9c02ab9d0d





3be260cc18f8
6f9c02ab9d0d
7c7546ccf646
6f9c02ab9d0d


1f403624bde3
f233ea5c9e0d
3be260cc18f8
449aad3e2535
6f9c02ab9d0d
7c7546ccf646
1da177e4c3f4

afa0f557cb15
1da177e4c3f4
afa0f557cb15
af11c397fd88
495d357301e1
1da177e4c3f4

b4fdcb02f1e3
1da177e4c3f4
20d0189b1012
a71207713a36
20d0189b1012

1da177e4c3f4
1eff9d322a44
e9c7469bb4f5
5a7bbad27a41
e5dcdd80a606

20d0189b1012
20d0189b1012




6283815d1853
20d0189b1012














f1cad2b68ed1
20d0189b1012


796a5cf083c2
20d0189b1012

4246a0b63bd8
20d0189b1012














1da177e4c3f4

fd01b88c75a7
1da177e4c3f4

9d8f0363623b
1da177e4c3f4

3be260cc18f8



84fc4b56db85
1da177e4c3f4

2604b703b6b3
1da177e4c3f4


afa0f557cb15
1da177e4c3f4
7c7546ccf646
80c3a6ce4ba4
3be260cc18f8
5c675f83c68f
1da177e4c3f4



2604b703b6b3
1da177e4c3f4



2604b703b6b3
1da177e4c3f4

1da177e4c3f4


0efb9e6191e1
d9d166c2a9d5

2604b703b6b3
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346











                                                                       
 

                                                                    
                                                                     

  

                            
                           
                         
                       
               
                   
 
  
                                              
   
                                                                              
 
                        
                                 
 

                                   
                              
 













                                                         

 





                                                                       
                                                          
 
                                 

                       

                                               
 
                                                         
                                                                                    

                                                                 
 
                          


                   
                                                                                  
 
                                 
                               
 
                              

                                                                     
                                            
 
                             

 
                                                                           
 
                                 
                             
                   
                                       
 
                                                                            

                                    

                            
                
                                
 
                                    
                                        
                                                        
                                 
 
                                                             

                                                                                            



                                  




                                                                       
 

                                                             
 
                                                     
                      
 

                                                                  
         
                                

                                                                                       


                         




                                                                            
          
                                                
           

                                                                 
                                        


                                                     
 












                                                                          






                    
                                           
 
                                 
                
 

                                      




                                                     
                                                              
 





                                            
 
 
                                                                








                                                                         
                                              
 
                                                       

                               
                                                
                                   
 




                                                         





                                                                        
                             
                                                  
                            


                                                                     
                                                              
                                                           
                            
                                        
                                
                 

 
                                                        
 
                                        
 
                    

 
                                                                     
 
                              
                                 

                                                       
 
                                                   
                                             
                       

         
            




                                                                            
 














                                                                            
 


                                                                     
                                                                 

                                                                               
                                         














                                                                          

 
                                                                     

 
                                                                   

 



                                                          
                                                 

                                   
                                       


                                              
                                      
                                        
                                     
                                      
                                         
                                           



                                    
                                                             



                              
                                                        

 


                         
                                                                     

                                                          
                            
/*
   linear.c : Multiple Devices driver for Linux
	      Copyright (C) 1994-96 Marc ZYNGIER
	      <zyngier@ufr-info-p7.ibp.fr> or
	      <maz@gloups.fdn.fr>

   Linear mode management functions.

   This program is free software; you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
   the Free Software Foundation; either version 2, or (at your option)
   any later version.

   You should have received a copy of the GNU General Public License
   (for example /usr/src/linux/COPYING); if not, write to the Free
   Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/

#include <linux/blkdev.h>
#include <linux/raid/md_u.h>
#include <linux/seq_file.h>
#include <linux/module.h>
#include <linux/slab.h>
#include "md.h"
#include "linear.h"

/*
 * find which device holds a particular offset
 */
static inline struct dev_info *which_dev(struct mddev *mddev, sector_t sector)
{
	int lo, mid, hi;
	struct linear_conf *conf;

	lo = 0;
	hi = mddev->raid_disks - 1;
	conf = mddev->private;

	/*
	 * Binary Search
	 */

	while (hi > lo) {

		mid = (hi + lo) / 2;
		if (sector < conf->disks[mid].end_sector)
			hi = mid;
		else
			lo = mid + 1;
	}

	return conf->disks + lo;
}

/*
 * In linear_congested() conf->raid_disks is used as a copy of
 * mddev->raid_disks to iterate conf->disks[], because conf->raid_disks
 * and conf->disks[] are created in linear_conf(), they are always
 * consitent with each other, but mddev->raid_disks does not.
 */
static int linear_congested(struct mddev *mddev, int bits)
{
	struct linear_conf *conf;
	int i, ret = 0;

	rcu_read_lock();
	conf = rcu_dereference(mddev->private);

	for (i = 0; i < conf->raid_disks && !ret ; i++) {
		struct request_queue *q = bdev_get_queue(conf->disks[i].rdev->bdev);
		ret |= bdi_congested(&q->backing_dev_info, bits);
	}

	rcu_read_unlock();
	return ret;
}

static sector_t linear_size(struct mddev *mddev, sector_t sectors, int raid_disks)
{
	struct linear_conf *conf;
	sector_t array_sectors;

	conf = mddev->private;
	WARN_ONCE(sectors || raid_disks,
		  "%s does not support generic reshape\n", __func__);
	array_sectors = conf->array_sectors;

	return array_sectors;
}

static struct linear_conf *linear_conf(struct mddev *mddev, int raid_disks)
{
	struct linear_conf *conf;
	struct md_rdev *rdev;
	int i, cnt;
	bool discard_supported = false;

	conf = kzalloc (sizeof (*conf) + raid_disks*sizeof(struct dev_info),
			GFP_KERNEL);
	if (!conf)
		return NULL;

	cnt = 0;
	conf->array_sectors = 0;

	rdev_for_each(rdev, mddev) {
		int j = rdev->raid_disk;
		struct dev_info *disk = conf->disks + j;
		sector_t sectors;

		if (j < 0 || j >= raid_disks || disk->rdev) {
			printk(KERN_ERR "md/linear:%s: disk numbering problem. Aborting!\n",
			       mdname(mddev));
			goto out;
		}

		disk->rdev = rdev;
		if (mddev->chunk_sectors) {
			sectors = rdev->sectors;
			sector_div(sectors, mddev->chunk_sectors);
			rdev->sectors = sectors * mddev->chunk_sectors;
		}

		disk_stack_limits(mddev->gendisk, rdev->bdev,
				  rdev->data_offset << 9);

		conf->array_sectors += rdev->sectors;
		cnt++;

		if (blk_queue_discard(bdev_get_queue(rdev->bdev)))
			discard_supported = true;
	}
	if (cnt != raid_disks) {
		printk(KERN_ERR "md/linear:%s: not enough drives present. Aborting!\n",
		       mdname(mddev));
		goto out;
	}

	if (!discard_supported)
		queue_flag_clear_unlocked(QUEUE_FLAG_DISCARD, mddev->queue);
	else
		queue_flag_set_unlocked(QUEUE_FLAG_DISCARD, mddev->queue);

	/*
	 * Here we calculate the device offsets.
	 */
	conf->disks[0].end_sector = conf->disks[0].rdev->sectors;

	for (i = 1; i < raid_disks; i++)
		conf->disks[i].end_sector =
			conf->disks[i-1].end_sector +
			conf->disks[i].rdev->sectors;

	/*
	 * conf->raid_disks is copy of mddev->raid_disks. The reason to
	 * keep a copy of mddev->raid_disks in struct linear_conf is,
	 * mddev->raid_disks may not be consistent with pointers number of
	 * conf->disks[] when it is updated in linear_add() and used to
	 * iterate old conf->disks[] earray in linear_congested().
	 * Here conf->raid_disks is always consitent with number of
	 * pointers in conf->disks[] array, and mddev->private is updated
	 * with rcu_assign_pointer() in linear_addr(), such race can be
	 * avoided.
	 */
	conf->raid_disks = raid_disks;

	return conf;

out:
	kfree(conf);
	return NULL;
}

static int linear_run (struct mddev *mddev)
{
	struct linear_conf *conf;
	int ret;

	if (md_check_no_bitmap(mddev))
		return -EINVAL;
	conf = linear_conf(mddev, mddev->raid_disks);

	if (!conf)
		return 1;
	mddev->private = conf;
	md_set_array_sectors(mddev, linear_size(mddev, 0, 0));

	ret =  md_integrity_register(mddev);
	if (ret) {
		kfree(conf);
		mddev->private = NULL;
	}
	return ret;
}

static int linear_add(struct mddev *mddev, struct md_rdev *rdev)
{
	/* Adding a drive to a linear array allows the array to grow.
	 * It is permitted if the new drive has a matching superblock
	 * already on it, with raid_disk equal to raid_disks.
	 * It is achieved by creating a new linear_private_data structure
	 * and swapping it in in-place of the current one.
	 * The current one is never freed until the array is stopped.
	 * This avoids races.
	 */
	struct linear_conf *newconf, *oldconf;

	if (rdev->saved_raid_disk != mddev->raid_disks)
		return -EINVAL;

	rdev->raid_disk = rdev->saved_raid_disk;
	rdev->saved_raid_disk = -1;

	newconf = linear_conf(mddev,mddev->raid_disks+1);

	if (!newconf)
		return -ENOMEM;

	/* newconf->raid_disks already keeps a copy of * the increased
	 * value of mddev->raid_disks, WARN_ONCE() is just used to make
	 * sure of this. It is possible that oldconf is still referenced
	 * in linear_congested(), therefore kfree_rcu() is used to free
	 * oldconf until no one uses it anymore.
	 */
	mddev_suspend(mddev);
	oldconf = rcu_dereference(mddev->private);
	mddev->raid_disks++;
	WARN_ONCE(mddev->raid_disks != newconf->raid_disks,
		"copied raid_disks doesn't match mddev->raid_disks");
	rcu_assign_pointer(mddev->private, newconf);
	md_set_array_sectors(mddev, linear_size(mddev, 0, 0));
	set_capacity(mddev->gendisk, mddev->array_sectors);
	mddev_resume(mddev);
	revalidate_disk(mddev->gendisk);
	kfree_rcu(oldconf, rcu);
	return 0;
}

static void linear_free(struct mddev *mddev, void *priv)
{
	struct linear_conf *conf = priv;

	kfree(conf);
}

static void linear_make_request(struct mddev *mddev, struct bio *bio)
{
	char b[BDEVNAME_SIZE];
	struct dev_info *tmp_dev;
	struct bio *split;
	sector_t start_sector, end_sector, data_offset;