diff options
author | Linus Torvalds <torvalds@g5.osdl.org> | 2006-04-02 16:11:25 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@g5.osdl.org> | 2006-04-02 16:11:25 -0400 |
commit | a2308b7f0838406c346a2b0259ff88c7fcf41e79 (patch) | |
tree | f0d6e3d05d301d3aadb7e8bdd42083be98e29e0d | |
parent | f27f0a045b79de5729d064497e21a70871f1d6fe (diff) | |
parent | 1b895840ce93fd2d150a86c800a3085eaab4eb9e (diff) |
Merge git://oss.sgi.com:8090/oss/git/xfs-2.6
* git://oss.sgi.com:8090/oss/git/xfs-2.6:
[XFS] Provide XFS support for the splice syscall.
[XFS] Reenable write barriers by default.
[XFS] Make project quota enforcement return an error code consistent with
[XFS] Implement the silent parameter to fill_super, previously ignored.
[XFS] Cleanup comment to remove reference to obsoleted function
-rw-r--r-- | fs/xfs/linux-2.6/xfs_file.c | 113 | ||||
-rw-r--r-- | fs/xfs/linux-2.6/xfs_linux.h | 1 | ||||
-rw-r--r-- | fs/xfs/linux-2.6/xfs_lrw.c | 120 | ||||
-rw-r--r-- | fs/xfs/linux-2.6/xfs_lrw.h | 11 | ||||
-rw-r--r-- | fs/xfs/linux-2.6/xfs_super.c | 11 | ||||
-rw-r--r-- | fs/xfs/linux-2.6/xfs_vnode.h | 12 | ||||
-rw-r--r-- | fs/xfs/quota/xfs_qm.c | 17 | ||||
-rw-r--r-- | fs/xfs/quota/xfs_trans_dquot.c | 68 | ||||
-rw-r--r-- | fs/xfs/xfs_bmap.c | 11 | ||||
-rw-r--r-- | fs/xfs/xfs_bmap.h | 9 | ||||
-rw-r--r-- | fs/xfs/xfs_clnt.h | 1 | ||||
-rw-r--r-- | fs/xfs/xfs_error.h | 3 | ||||
-rw-r--r-- | fs/xfs/xfs_mount.c | 71 | ||||
-rw-r--r-- | fs/xfs/xfs_mount.h | 5 | ||||
-rw-r--r-- | fs/xfs/xfs_quota.h | 5 | ||||
-rw-r--r-- | fs/xfs/xfs_vfsops.c | 10 | ||||
-rw-r--r-- | fs/xfs/xfs_vnodeops.c | 4 |
17 files changed, 309 insertions, 163 deletions
diff --git a/fs/xfs/linux-2.6/xfs_file.c b/fs/xfs/linux-2.6/xfs_file.c index 85997b1205f5..ae4c4754ed31 100644 --- a/fs/xfs/linux-2.6/xfs_file.c +++ b/fs/xfs/linux-2.6/xfs_file.c | |||
@@ -69,7 +69,6 @@ __xfs_file_read( | |||
69 | return rval; | 69 | return rval; |
70 | } | 70 | } |
71 | 71 | ||
72 | |||
73 | STATIC ssize_t | 72 | STATIC ssize_t |
74 | xfs_file_aio_read( | 73 | xfs_file_aio_read( |
75 | struct kiocb *iocb, | 74 | struct kiocb *iocb, |
@@ -90,7 +89,6 @@ xfs_file_aio_read_invis( | |||
90 | return __xfs_file_read(iocb, buf, IO_ISAIO|IO_INVIS, count, pos); | 89 | return __xfs_file_read(iocb, buf, IO_ISAIO|IO_INVIS, count, pos); |
91 | } | 90 | } |
92 | 91 | ||
93 | |||
94 | STATIC inline ssize_t | 92 | STATIC inline ssize_t |
95 | __xfs_file_write( | 93 | __xfs_file_write( |
96 | struct kiocb *iocb, | 94 | struct kiocb *iocb, |
@@ -113,7 +111,6 @@ __xfs_file_write( | |||
113 | return rval; | 111 | return rval; |
114 | } | 112 | } |
115 | 113 | ||
116 | |||
117 | STATIC ssize_t | 114 | STATIC ssize_t |
118 | xfs_file_aio_write( | 115 | xfs_file_aio_write( |
119 | struct kiocb *iocb, | 116 | struct kiocb *iocb, |
@@ -134,7 +131,6 @@ xfs_file_aio_write_invis( | |||
134 | return __xfs_file_write(iocb, buf, IO_ISAIO|IO_INVIS, count, pos); | 131 | return __xfs_file_write(iocb, buf, IO_ISAIO|IO_INVIS, count, pos); |
135 | } | 132 | } |
136 | 133 | ||
137 | |||
138 | STATIC inline ssize_t | 134 | STATIC inline ssize_t |
139 | __xfs_file_readv( | 135 | __xfs_file_readv( |
140 | struct file *file, | 136 | struct file *file, |
@@ -179,7 +175,6 @@ xfs_file_readv_invis( | |||
179 | return __xfs_file_readv(file, iov, IO_INVIS, nr_segs, ppos); | 175 | return __xfs_file_readv(file, iov, IO_INVIS, nr_segs, ppos); |
180 | } | 176 | } |
181 | 177 | ||
182 | |||
183 | STATIC inline ssize_t | 178 | STATIC inline ssize_t |
184 | __xfs_file_writev( | 179 | __xfs_file_writev( |
185 | struct file *file, | 180 | struct file *file, |
@@ -204,7 +199,6 @@ __xfs_file_writev( | |||
204 | return rval; | 199 | return rval; |
205 | } | 200 | } |
206 | 201 | ||
207 | |||
208 | STATIC ssize_t | 202 | STATIC ssize_t |
209 | xfs_file_writev( | 203 | xfs_file_writev( |
210 | struct file *file, | 204 | struct file *file, |
@@ -228,7 +222,7 @@ xfs_file_writev_invis( | |||
228 | STATIC ssize_t | 222 | STATIC ssize_t |
229 | xfs_file_sendfile( | 223 | xfs_file_sendfile( |
230 | struct file *filp, | 224 | struct file *filp, |
231 | loff_t *ppos, | 225 | loff_t *pos, |
232 | size_t count, | 226 | size_t count, |
233 | read_actor_t actor, | 227 | read_actor_t actor, |
234 | void *target) | 228 | void *target) |
@@ -236,10 +230,80 @@ xfs_file_sendfile( | |||
236 | vnode_t *vp = vn_from_inode(filp->f_dentry->d_inode); | 230 | vnode_t *vp = vn_from_inode(filp->f_dentry->d_inode); |
237 | ssize_t rval; | 231 | ssize_t rval; |
238 | 232 | ||
239 | VOP_SENDFILE(vp, filp, ppos, 0, count, actor, target, NULL, rval); | 233 | VOP_SENDFILE(vp, filp, pos, 0, count, actor, target, NULL, rval); |
240 | return rval; | 234 | return rval; |
241 | } | 235 | } |
242 | 236 | ||
237 | STATIC ssize_t | ||
238 | xfs_file_sendfile_invis( | ||
239 | struct file *filp, | ||
240 | loff_t *pos, | ||
241 | size_t count, | ||
242 | read_actor_t actor, | ||
243 | void *target) | ||
244 | { | ||
245 | vnode_t *vp = vn_from_inode(filp->f_dentry->d_inode); | ||
246 | ssize_t rval; | ||
247 | |||
248 | VOP_SENDFILE(vp, filp, pos, IO_INVIS, count, actor, target, NULL, rval); | ||
249 | return rval; | ||
250 | } | ||
251 | |||
252 | STATIC ssize_t | ||
253 | xfs_file_splice_read( | ||
254 | struct file *infilp, | ||
255 | struct inode *pipe, | ||
256 | size_t len, | ||
257 | unsigned int flags) | ||
258 | { | ||
259 | vnode_t *vp = vn_from_inode(infilp->f_dentry->d_inode); | ||
260 | ssize_t rval; | ||
261 | |||
262 | VOP_SPLICE_READ(vp, infilp, pipe, len, flags, 0, NULL, rval); | ||
263 | return rval; | ||
264 | } | ||
265 | |||
266 | STATIC ssize_t | ||
267 | xfs_file_splice_read_invis( | ||
268 | struct file *infilp, | ||
269 | struct inode *pipe, | ||
270 | size_t len, | ||
271 | unsigned int flags) | ||
272 | { | ||
273 | vnode_t *vp = vn_from_inode(infilp->f_dentry->d_inode); | ||
274 | ssize_t rval; | ||
275 | |||
276 | VOP_SPLICE_READ(vp, infilp, pipe, len, flags, IO_INVIS, NULL, rval); | ||
277 | return rval; | ||
278 | } | ||
279 | |||
280 | STATIC ssize_t | ||
281 | xfs_file_splice_write( | ||
282 | struct inode *pipe, | ||
283 | struct file *outfilp, | ||
284 | size_t len, | ||
285 | unsigned int flags) | ||
286 | { | ||
287 | vnode_t *vp = vn_from_inode(outfilp->f_dentry->d_inode); | ||
288 | ssize_t rval; | ||
289 | |||
290 | VOP_SPLICE_WRITE(vp, pipe, outfilp, len, flags, 0, NULL, rval); | ||
291 | return rval; | ||
292 | } | ||
293 | |||
294 | STATIC ssize_t | ||
295 | xfs_file_splice_write_invis( | ||
296 | struct inode *pipe, | ||
297 | struct file *outfilp, | ||
298 | size_t len, | ||
299 | unsigned int flags) | ||
300 | { | ||
301 | vnode_t *vp = vn_from_inode(outfilp->f_dentry->d_inode); | ||
302 | ssize_t rval; | ||
303 | |||
304 | VOP_SPLICE_WRITE(vp, pipe, outfilp, len, flags, IO_INVIS, NULL, rval); | ||
305 | return rval; | ||
306 | } | ||
243 | 307 | ||
244 | STATIC int | 308 | STATIC int |
245 | xfs_file_open( | 309 | xfs_file_open( |
@@ -251,13 +315,10 @@ xfs_file_open( | |||
251 | 315 | ||
252 | if (!(filp->f_flags & O_LARGEFILE) && i_size_read(inode) > MAX_NON_LFS) | 316 | if (!(filp->f_flags & O_LARGEFILE) && i_size_read(inode) > MAX_NON_LFS) |
253 | return -EFBIG; | 317 | return -EFBIG; |
254 | |||
255 | ASSERT(vp); | ||
256 | VOP_OPEN(vp, NULL, error); | 318 | VOP_OPEN(vp, NULL, error); |
257 | return -error; | 319 | return -error; |
258 | } | 320 | } |
259 | 321 | ||
260 | |||
261 | STATIC int | 322 | STATIC int |
262 | xfs_file_release( | 323 | xfs_file_release( |
263 | struct inode *inode, | 324 | struct inode *inode, |
@@ -271,7 +332,6 @@ xfs_file_release( | |||
271 | return -error; | 332 | return -error; |
272 | } | 333 | } |
273 | 334 | ||
274 | |||
275 | STATIC int | 335 | STATIC int |
276 | xfs_file_fsync( | 336 | xfs_file_fsync( |
277 | struct file *filp, | 337 | struct file *filp, |
@@ -285,21 +345,11 @@ xfs_file_fsync( | |||
285 | 345 | ||
286 | if (datasync) | 346 | if (datasync) |
287 | flags |= FSYNC_DATA; | 347 | flags |= FSYNC_DATA; |
288 | |||
289 | ASSERT(vp); | ||
290 | VOP_FSYNC(vp, flags, NULL, (xfs_off_t)0, (xfs_off_t)-1, error); | 348 | VOP_FSYNC(vp, flags, NULL, (xfs_off_t)0, (xfs_off_t)-1, error); |
291 | return -error; | 349 | return -error; |
292 | } | 350 | } |
293 | 351 | ||
294 | /* | ||
295 | * xfs_file_readdir maps to VOP_READDIR(). | ||
296 | * We need to build a uio, cred, ... | ||
297 | */ | ||
298 | |||
299 | #define nextdp(dp) ((struct xfs_dirent *)((char *)(dp) + (dp)->d_reclen)) | ||
300 | |||
301 | #ifdef CONFIG_XFS_DMAPI | 352 | #ifdef CONFIG_XFS_DMAPI |
302 | |||
303 | STATIC struct page * | 353 | STATIC struct page * |
304 | xfs_vm_nopage( | 354 | xfs_vm_nopage( |
305 | struct vm_area_struct *area, | 355 | struct vm_area_struct *area, |
@@ -319,10 +369,8 @@ xfs_vm_nopage( | |||
319 | 369 | ||
320 | return filemap_nopage(area, address, type); | 370 | return filemap_nopage(area, address, type); |
321 | } | 371 | } |
322 | |||
323 | #endif /* CONFIG_XFS_DMAPI */ | 372 | #endif /* CONFIG_XFS_DMAPI */ |
324 | 373 | ||
325 | |||
326 | STATIC int | 374 | STATIC int |
327 | xfs_file_readdir( | 375 | xfs_file_readdir( |
328 | struct file *filp, | 376 | struct file *filp, |
@@ -330,7 +378,7 @@ xfs_file_readdir( | |||
330 | filldir_t filldir) | 378 | filldir_t filldir) |
331 | { | 379 | { |
332 | int error = 0; | 380 | int error = 0; |
333 | vnode_t *vp; | 381 | vnode_t *vp = vn_from_inode(filp->f_dentry->d_inode); |
334 | uio_t uio; | 382 | uio_t uio; |
335 | iovec_t iov; | 383 | iovec_t iov; |
336 | int eof = 0; | 384 | int eof = 0; |
@@ -340,9 +388,6 @@ xfs_file_readdir( | |||
340 | xfs_off_t start_offset, curr_offset; | 388 | xfs_off_t start_offset, curr_offset; |
341 | xfs_dirent_t *dbp = NULL; | 389 | xfs_dirent_t *dbp = NULL; |
342 | 390 | ||
343 | vp = vn_from_inode(filp->f_dentry->d_inode); | ||
344 | ASSERT(vp); | ||
345 | |||
346 | /* Try fairly hard to get memory */ | 391 | /* Try fairly hard to get memory */ |
347 | do { | 392 | do { |
348 | if ((read_buf = (caddr_t)kmalloc(rlen, GFP_KERNEL))) | 393 | if ((read_buf = (caddr_t)kmalloc(rlen, GFP_KERNEL))) |
@@ -387,7 +432,7 @@ xfs_file_readdir( | |||
387 | } | 432 | } |
388 | size -= dbp->d_reclen; | 433 | size -= dbp->d_reclen; |
389 | curr_offset = (loff_t)dbp->d_off /* & 0x7fffffff */; | 434 | curr_offset = (loff_t)dbp->d_off /* & 0x7fffffff */; |
390 | dbp = nextdp(dbp); | 435 | dbp = (xfs_dirent_t *)((char *)dbp + dbp->d_reclen); |
391 | } | 436 | } |
392 | } | 437 | } |
393 | done: | 438 | done: |
@@ -402,7 +447,6 @@ done: | |||
402 | return -error; | 447 | return -error; |
403 | } | 448 | } |
404 | 449 | ||
405 | |||
406 | STATIC int | 450 | STATIC int |
407 | xfs_file_mmap( | 451 | xfs_file_mmap( |
408 | struct file *filp, | 452 | struct file *filp, |
@@ -457,11 +501,10 @@ xfs_file_ioctl_invis( | |||
457 | unsigned int cmd, | 501 | unsigned int cmd, |
458 | unsigned long arg) | 502 | unsigned long arg) |
459 | { | 503 | { |
460 | int error; | ||
461 | struct inode *inode = filp->f_dentry->d_inode; | 504 | struct inode *inode = filp->f_dentry->d_inode; |
462 | vnode_t *vp = vn_from_inode(inode); | 505 | vnode_t *vp = vn_from_inode(inode); |
506 | int error; | ||
463 | 507 | ||
464 | ASSERT(vp); | ||
465 | VOP_IOCTL(vp, inode, filp, IO_INVIS, cmd, (void __user *)arg, error); | 508 | VOP_IOCTL(vp, inode, filp, IO_INVIS, cmd, (void __user *)arg, error); |
466 | VMODIFY(vp); | 509 | VMODIFY(vp); |
467 | 510 | ||
@@ -537,6 +580,8 @@ const struct file_operations xfs_file_operations = { | |||
537 | .aio_read = xfs_file_aio_read, | 580 | .aio_read = xfs_file_aio_read, |
538 | .aio_write = xfs_file_aio_write, | 581 | .aio_write = xfs_file_aio_write, |
539 | .sendfile = xfs_file_sendfile, | 582 | .sendfile = xfs_file_sendfile, |
583 | .splice_read = xfs_file_splice_read, | ||
584 | .splice_write = xfs_file_splice_write, | ||
540 | .unlocked_ioctl = xfs_file_ioctl, | 585 | .unlocked_ioctl = xfs_file_ioctl, |
541 | #ifdef CONFIG_COMPAT | 586 | #ifdef CONFIG_COMPAT |
542 | .compat_ioctl = xfs_file_compat_ioctl, | 587 | .compat_ioctl = xfs_file_compat_ioctl, |
@@ -558,7 +603,9 @@ const struct file_operations xfs_invis_file_operations = { | |||
558 | .writev = xfs_file_writev_invis, | 603 | .writev = xfs_file_writev_invis, |
559 | .aio_read = xfs_file_aio_read_invis, | 604 | .aio_read = xfs_file_aio_read_invis, |
560 | .aio_write = xfs_file_aio_write_invis, | 605 | .aio_write = xfs_file_aio_write_invis, |
561 | .sendfile = xfs_file_sendfile, | 606 | .sendfile = xfs_file_sendfile_invis, |
607 | .splice_read = xfs_file_splice_read_invis, | ||
608 | .splice_write = xfs_file_splice_write_invis, | ||
562 | .unlocked_ioctl = xfs_file_ioctl_invis, | 609 | .unlocked_ioctl = xfs_file_ioctl_invis, |
563 | #ifdef CONFIG_COMPAT | 610 | #ifdef CONFIG_COMPAT |
564 | .compat_ioctl = xfs_file_compat_invis_ioctl, | 611 | .compat_ioctl = xfs_file_compat_invis_ioctl, |
diff --git a/fs/xfs/linux-2.6/xfs_linux.h b/fs/xfs/linux-2.6/xfs_linux.h index 1fe09f2d6519..e9fe43d74768 100644 --- a/fs/xfs/linux-2.6/xfs_linux.h +++ b/fs/xfs/linux-2.6/xfs_linux.h | |||
@@ -103,6 +103,7 @@ | |||
103 | */ | 103 | */ |
104 | #undef HAVE_REFCACHE /* reference cache not needed for NFS in 2.6 */ | 104 | #undef HAVE_REFCACHE /* reference cache not needed for NFS in 2.6 */ |
105 | #define HAVE_SENDFILE /* sendfile(2) exists in 2.6, but not in 2.4 */ | 105 | #define HAVE_SENDFILE /* sendfile(2) exists in 2.6, but not in 2.4 */ |
106 | #define HAVE_SPLICE /* a splice(2) exists in 2.6, but not in 2.4 */ | ||
106 | #ifdef CONFIG_SMP | 107 | #ifdef CONFIG_SMP |
107 | #define HAVE_PERCPU_SB /* per cpu superblock counters are a 2.6 feature */ | 108 | #define HAVE_PERCPU_SB /* per cpu superblock counters are a 2.6 feature */ |
108 | #else | 109 | #else |
diff --git a/fs/xfs/linux-2.6/xfs_lrw.c b/fs/xfs/linux-2.6/xfs_lrw.c index 84ddf1893894..90cd314acbaa 100644 --- a/fs/xfs/linux-2.6/xfs_lrw.c +++ b/fs/xfs/linux-2.6/xfs_lrw.c | |||
@@ -301,36 +301,23 @@ xfs_sendfile( | |||
301 | void *target, | 301 | void *target, |
302 | cred_t *credp) | 302 | cred_t *credp) |
303 | { | 303 | { |
304 | xfs_inode_t *ip = XFS_BHVTOI(bdp); | ||
305 | xfs_mount_t *mp = ip->i_mount; | ||
304 | ssize_t ret; | 306 | ssize_t ret; |
305 | xfs_fsize_t n; | ||
306 | xfs_inode_t *ip; | ||
307 | xfs_mount_t *mp; | ||
308 | vnode_t *vp; | ||
309 | |||
310 | ip = XFS_BHVTOI(bdp); | ||
311 | vp = BHV_TO_VNODE(bdp); | ||
312 | mp = ip->i_mount; | ||
313 | 307 | ||
314 | XFS_STATS_INC(xs_read_calls); | 308 | XFS_STATS_INC(xs_read_calls); |
315 | 309 | if (XFS_FORCED_SHUTDOWN(mp)) | |
316 | n = XFS_MAXIOFFSET(mp) - *offset; | ||
317 | if ((n <= 0) || (count == 0)) | ||
318 | return 0; | ||
319 | |||
320 | if (n < count) | ||
321 | count = n; | ||
322 | |||
323 | if (XFS_FORCED_SHUTDOWN(ip->i_mount)) | ||
324 | return -EIO; | 310 | return -EIO; |
325 | 311 | ||
326 | xfs_ilock(ip, XFS_IOLOCK_SHARED); | 312 | xfs_ilock(ip, XFS_IOLOCK_SHARED); |
327 | 313 | ||
328 | if (DM_EVENT_ENABLED(vp->v_vfsp, ip, DM_EVENT_READ) && | 314 | if (DM_EVENT_ENABLED(BHV_TO_VNODE(bdp)->v_vfsp, ip, DM_EVENT_READ) && |
329 | (!(ioflags & IO_INVIS))) { | 315 | (!(ioflags & IO_INVIS))) { |
330 | vrwlock_t locktype = VRWLOCK_READ; | 316 | vrwlock_t locktype = VRWLOCK_READ; |
331 | int error; | 317 | int error; |
332 | 318 | ||
333 | error = XFS_SEND_DATA(mp, DM_EVENT_READ, BHV_TO_VNODE(bdp), *offset, count, | 319 | error = XFS_SEND_DATA(mp, DM_EVENT_READ, BHV_TO_VNODE(bdp), |
320 | *offset, count, | ||
334 | FILP_DELAY_FLAG(filp), &locktype); | 321 | FILP_DELAY_FLAG(filp), &locktype); |
335 | if (error) { | 322 | if (error) { |
336 | xfs_iunlock(ip, XFS_IOLOCK_SHARED); | 323 | xfs_iunlock(ip, XFS_IOLOCK_SHARED); |
@@ -340,12 +327,96 @@ xfs_sendfile( | |||
340 | xfs_rw_enter_trace(XFS_SENDFILE_ENTER, &ip->i_iocore, | 327 | xfs_rw_enter_trace(XFS_SENDFILE_ENTER, &ip->i_iocore, |
341 | (void *)(unsigned long)target, count, *offset, ioflags); | 328 | (void *)(unsigned long)target, count, *offset, ioflags); |
342 | ret = generic_file_sendfile(filp, offset, count, actor, target); | 329 | ret = generic_file_sendfile(filp, offset, count, actor, target); |
330 | if (ret > 0) | ||
331 | XFS_STATS_ADD(xs_read_bytes, ret); | ||
343 | 332 | ||
344 | xfs_iunlock(ip, XFS_IOLOCK_SHARED); | 333 | xfs_iunlock(ip, XFS_IOLOCK_SHARED); |
334 | return ret; | ||
335 | } | ||
345 | 336 | ||
337 | ssize_t | ||
338 | xfs_splice_read( | ||
339 | bhv_desc_t *bdp, | ||
340 | struct file *infilp, | ||
341 | struct inode *pipe, | ||
342 | size_t count, | ||
343 | int flags, | ||
344 | int ioflags, | ||
345 | cred_t *credp) | ||
346 | { | ||
347 | xfs_inode_t *ip = XFS_BHVTOI(bdp); | ||
348 | xfs_mount_t *mp = ip->i_mount; | ||
349 | ssize_t ret; | ||
350 | |||
351 | XFS_STATS_INC(xs_read_calls); | ||
352 | if (XFS_FORCED_SHUTDOWN(ip->i_mount)) | ||
353 | return -EIO; | ||
354 | |||
355 | xfs_ilock(ip, XFS_IOLOCK_SHARED); | ||
356 | |||
357 | if (DM_EVENT_ENABLED(BHV_TO_VNODE(bdp)->v_vfsp, ip, DM_EVENT_READ) && | ||
358 | (!(ioflags & IO_INVIS))) { | ||
359 | vrwlock_t locktype = VRWLOCK_READ; | ||
360 | int error; | ||
361 | |||
362 | error = XFS_SEND_DATA(mp, DM_EVENT_READ, BHV_TO_VNODE(bdp), | ||
363 | infilp->f_pos, count, | ||
364 | FILP_DELAY_FLAG(infilp), &locktype); | ||
365 | if (error) { | ||
366 | xfs_iunlock(ip, XFS_IOLOCK_SHARED); | ||
367 | return -error; | ||
368 | } | ||
369 | } | ||
370 | xfs_rw_enter_trace(XFS_SPLICE_READ_ENTER, &ip->i_iocore, | ||
371 | pipe, count, infilp->f_pos, ioflags); | ||
372 | ret = generic_file_splice_read(infilp, pipe, count, flags); | ||
346 | if (ret > 0) | 373 | if (ret > 0) |
347 | XFS_STATS_ADD(xs_read_bytes, ret); | 374 | XFS_STATS_ADD(xs_read_bytes, ret); |
348 | 375 | ||
376 | xfs_iunlock(ip, XFS_IOLOCK_SHARED); | ||
377 | return ret; | ||
378 | } | ||
379 | |||
380 | ssize_t | ||
381 | xfs_splice_write( | ||
382 | bhv_desc_t *bdp, | ||
383 | struct inode *pipe, | ||
384 | struct file *outfilp, | ||
385 | size_t count, | ||
386 | int flags, | ||
387 | int ioflags, | ||
388 | cred_t *credp) | ||
389 | { | ||
390 | xfs_inode_t *ip = XFS_BHVTOI(bdp); | ||
391 | xfs_mount_t *mp = ip->i_mount; | ||
392 | ssize_t ret; | ||
393 | |||
394 | XFS_STATS_INC(xs_write_calls); | ||
395 | if (XFS_FORCED_SHUTDOWN(ip->i_mount)) | ||
396 | return -EIO; | ||
397 | |||
398 | xfs_ilock(ip, XFS_IOLOCK_EXCL); | ||
399 | |||
400 | if (DM_EVENT_ENABLED(BHV_TO_VNODE(bdp)->v_vfsp, ip, DM_EVENT_WRITE) && | ||
401 | (!(ioflags & IO_INVIS))) { | ||
402 | vrwlock_t locktype = VRWLOCK_WRITE; | ||
403 | int error; | ||
404 | |||
405 | error = XFS_SEND_DATA(mp, DM_EVENT_WRITE, BHV_TO_VNODE(bdp), | ||
406 | outfilp->f_pos, count, | ||
407 | FILP_DELAY_FLAG(outfilp), &locktype); | ||
408 | if (error) { | ||
409 | xfs_iunlock(ip, XFS_IOLOCK_EXCL); | ||
410 | return -error; | ||
411 | } | ||
412 | } | ||
413 | xfs_rw_enter_trace(XFS_SPLICE_WRITE_ENTER, &ip->i_iocore, | ||
414 | pipe, count, outfilp->f_pos, ioflags); | ||
415 | ret = generic_file_splice_write(pipe, outfilp, count, flags); | ||
416 | if (ret > 0) | ||
417 | XFS_STATS_ADD(xs_write_bytes, ret); | ||
418 | |||
419 | xfs_iunlock(ip, XFS_IOLOCK_EXCL); | ||
349 | return ret; | 420 | return ret; |
350 | } | 421 | } |
351 | 422 | ||
@@ -363,7 +434,7 @@ xfs_zero_last_block( | |||
363 | xfs_fsize_t end_size) | 434 | xfs_fsize_t end_size) |
364 | { | 435 | { |
365 | xfs_fileoff_t last_fsb; | 436 | xfs_fileoff_t last_fsb; |
366 | xfs_mount_t *mp; | 437 | xfs_mount_t *mp = io->io_mount; |
367 | int nimaps; | 438 | int nimaps; |
368 | int zero_offset; | 439 | int zero_offset; |
369 | int zero_len; | 440 | int zero_len; |
@@ -373,8 +444,6 @@ xfs_zero_last_block( | |||
373 | 444 | ||
374 | ASSERT(ismrlocked(io->io_lock, MR_UPDATE) != 0); | 445 | ASSERT(ismrlocked(io->io_lock, MR_UPDATE) != 0); |
375 | 446 | ||
376 | mp = io->io_mount; | ||
377 | |||
378 | zero_offset = XFS_B_FSB_OFFSET(mp, isize); | 447 | zero_offset = XFS_B_FSB_OFFSET(mp, isize); |
379 | if (zero_offset == 0) { | 448 | if (zero_offset == 0) { |
380 | /* | 449 | /* |
@@ -405,10 +474,9 @@ xfs_zero_last_block( | |||
405 | * don't deadlock when the buffer cache calls back to us. | 474 | * don't deadlock when the buffer cache calls back to us. |
406 | */ | 475 | */ |
407 | XFS_IUNLOCK(mp, io, XFS_ILOCK_EXCL| XFS_EXTSIZE_RD); | 476 | XFS_IUNLOCK(mp, io, XFS_ILOCK_EXCL| XFS_EXTSIZE_RD); |
408 | loff = XFS_FSB_TO_B(mp, last_fsb); | ||
409 | 477 | ||
478 | loff = XFS_FSB_TO_B(mp, last_fsb); | ||
410 | zero_len = mp->m_sb.sb_blocksize - zero_offset; | 479 | zero_len = mp->m_sb.sb_blocksize - zero_offset; |
411 | |||
412 | error = xfs_iozero(ip, loff + zero_offset, zero_len, end_size); | 480 | error = xfs_iozero(ip, loff + zero_offset, zero_len, end_size); |
413 | 481 | ||
414 | XFS_ILOCK(mp, io, XFS_ILOCK_EXCL|XFS_EXTSIZE_RD); | 482 | XFS_ILOCK(mp, io, XFS_ILOCK_EXCL|XFS_EXTSIZE_RD); |
@@ -441,7 +509,7 @@ xfs_zero_eof( | |||
441 | xfs_fileoff_t zero_count_fsb; | 509 | xfs_fileoff_t zero_count_fsb; |
442 | xfs_fileoff_t last_fsb; | 510 | xfs_fileoff_t last_fsb; |
443 | xfs_extlen_t buf_len_fsb; | 511 | xfs_extlen_t buf_len_fsb; |
444 | xfs_mount_t *mp; | 512 | xfs_mount_t *mp = io->io_mount; |
445 | int nimaps; | 513 | int nimaps; |
446 | int error = 0; | 514 | int error = 0; |
447 | xfs_bmbt_irec_t imap; | 515 | xfs_bmbt_irec_t imap; |
@@ -450,8 +518,6 @@ xfs_zero_eof( | |||
450 | ASSERT(ismrlocked(io->io_iolock, MR_UPDATE)); | 518 | ASSERT(ismrlocked(io->io_iolock, MR_UPDATE)); |
451 | ASSERT(offset > isize); | 519 | ASSERT(offset > isize); |
452 | 520 | ||
453 | mp = io->io_mount; | ||
454 | |||
455 | /* | 521 | /* |
456 | * First handle zeroing the block on which isize resides. | 522 | * First handle zeroing the block on which isize resides. |
457 | * We only zero a part of that block so it is handled specially. | 523 | * We only zero a part of that block so it is handled specially. |
diff --git a/fs/xfs/linux-2.6/xfs_lrw.h b/fs/xfs/linux-2.6/xfs_lrw.h index 38864a88d42d..eaa5659713fb 100644 --- a/fs/xfs/linux-2.6/xfs_lrw.h +++ b/fs/xfs/linux-2.6/xfs_lrw.h | |||
@@ -60,6 +60,8 @@ struct xfs_iomap; | |||
60 | #define XFS_IOMAP_ALLOC_ENTER 25 | 60 | #define XFS_IOMAP_ALLOC_ENTER 25 |
61 | #define XFS_IOMAP_ALLOC_MAP 26 | 61 | #define XFS_IOMAP_ALLOC_MAP 26 |
62 | #define XFS_IOMAP_UNWRITTEN 27 | 62 | #define XFS_IOMAP_UNWRITTEN 27 |
63 | #define XFS_SPLICE_READ_ENTER 28 | ||
64 | #define XFS_SPLICE_WRITE_ENTER 29 | ||
63 | extern void xfs_rw_enter_trace(int, struct xfs_iocore *, | 65 | extern void xfs_rw_enter_trace(int, struct xfs_iocore *, |
64 | void *, size_t, loff_t, int); | 66 | void *, size_t, loff_t, int); |
65 | extern void xfs_inval_cached_trace(struct xfs_iocore *, | 67 | extern void xfs_inval_cached_trace(struct xfs_iocore *, |
@@ -78,6 +80,7 @@ extern int xfs_bmap(struct bhv_desc *, xfs_off_t, ssize_t, int, | |||
78 | struct xfs_iomap *, int *); | 80 | struct xfs_iomap *, int *); |
79 | extern int xfsbdstrat(struct xfs_mount *, struct xfs_buf *); | 81 | extern int xfsbdstrat(struct xfs_mount *, struct xfs_buf *); |
80 | extern int xfs_bdstrat_cb(struct xfs_buf *); | 82 | extern int xfs_bdstrat_cb(struct xfs_buf *); |
83 | extern int xfs_dev_is_read_only(struct xfs_mount *, char *); | ||
81 | 84 | ||
82 | extern int xfs_zero_eof(struct vnode *, struct xfs_iocore *, xfs_off_t, | 85 | extern int xfs_zero_eof(struct vnode *, struct xfs_iocore *, xfs_off_t, |
83 | xfs_fsize_t, xfs_fsize_t); | 86 | xfs_fsize_t, xfs_fsize_t); |
@@ -90,7 +93,11 @@ extern ssize_t xfs_write(struct bhv_desc *, struct kiocb *, | |||
90 | extern ssize_t xfs_sendfile(struct bhv_desc *, struct file *, | 93 | extern ssize_t xfs_sendfile(struct bhv_desc *, struct file *, |
91 | loff_t *, int, size_t, read_actor_t, | 94 | loff_t *, int, size_t, read_actor_t, |
92 | void *, struct cred *); | 95 | void *, struct cred *); |
93 | 96 | extern ssize_t xfs_splice_read(struct bhv_desc *, struct file *, | |
94 | extern int xfs_dev_is_read_only(struct xfs_mount *, char *); | 97 | struct inode *, size_t, int, int, |
98 | struct cred *); | ||
99 | extern ssize_t xfs_splice_write(struct bhv_desc *, struct inode *, | ||
100 | struct file *, size_t, int, int, | ||
101 | struct cred *); | ||
95 | 102 | ||
96 | #endif /* __XFS_LRW_H__ */ | 103 | #endif /* __XFS_LRW_H__ */ |
diff --git a/fs/xfs/linux-2.6/xfs_super.c b/fs/xfs/linux-2.6/xfs_super.c index 1884300417e3..68f4793e8a11 100644 --- a/fs/xfs/linux-2.6/xfs_super.c +++ b/fs/xfs/linux-2.6/xfs_super.c | |||
@@ -67,7 +67,8 @@ mempool_t *xfs_ioend_pool; | |||
67 | 67 | ||
68 | STATIC struct xfs_mount_args * | 68 | STATIC struct xfs_mount_args * |
69 | xfs_args_allocate( | 69 | xfs_args_allocate( |
70 | struct super_block *sb) | 70 | struct super_block *sb, |
71 | int silent) | ||
71 | { | 72 | { |
72 | struct xfs_mount_args *args; | 73 | struct xfs_mount_args *args; |
73 | 74 | ||
@@ -80,8 +81,8 @@ xfs_args_allocate( | |||
80 | args->flags |= XFSMNT_DIRSYNC; | 81 | args->flags |= XFSMNT_DIRSYNC; |
81 | if (sb->s_flags & MS_SYNCHRONOUS) | 82 | if (sb->s_flags & MS_SYNCHRONOUS) |
82 | args->flags |= XFSMNT_WSYNC; | 83 | args->flags |= XFSMNT_WSYNC; |
83 | 84 | if (silent) | |
84 | /* Default to 32 bit inodes on Linux all the time */ | 85 | args->flags |= XFSMNT_QUIET; |
85 | args->flags |= XFSMNT_32BITINODES; | 86 | args->flags |= XFSMNT_32BITINODES; |
86 | 87 | ||
87 | return args; | 88 | return args; |
@@ -719,7 +720,7 @@ xfs_fs_remount( | |||
719 | char *options) | 720 | char *options) |
720 | { | 721 | { |
721 | vfs_t *vfsp = vfs_from_sb(sb); | 722 | vfs_t *vfsp = vfs_from_sb(sb); |
722 | struct xfs_mount_args *args = xfs_args_allocate(sb); | 723 | struct xfs_mount_args *args = xfs_args_allocate(sb, 0); |
723 | int error; | 724 | int error; |
724 | 725 | ||
725 | VFS_PARSEARGS(vfsp, options, args, 1, error); | 726 | VFS_PARSEARGS(vfsp, options, args, 1, error); |
@@ -825,7 +826,7 @@ xfs_fs_fill_super( | |||
825 | { | 826 | { |
826 | vnode_t *rootvp; | 827 | vnode_t *rootvp; |
827 | struct vfs *vfsp = vfs_allocate(sb); | 828 | struct vfs *vfsp = vfs_allocate(sb); |
828 | struct xfs_mount_args *args = xfs_args_allocate(sb); | 829 | struct xfs_mount_args *args = xfs_args_allocate(sb, silent); |
829 | struct kstatfs statvfs; | 830 | struct kstatfs statvfs; |
830 | int error, error2; | 831 | int error, error2; |
831 | 832 | ||
diff --git a/fs/xfs/linux-2.6/xfs_vnode.h b/fs/xfs/linux-2.6/xfs_vnode.h index 06f5845e9568..6f1c79a28f8b 100644 --- a/fs/xfs/linux-2.6/xfs_vnode.h +++ b/fs/xfs/linux-2.6/xfs_vnode.h | |||
@@ -173,6 +173,12 @@ typedef ssize_t (*vop_write_t)(bhv_desc_t *, struct kiocb *, | |||
173 | typedef ssize_t (*vop_sendfile_t)(bhv_desc_t *, struct file *, | 173 | typedef ssize_t (*vop_sendfile_t)(bhv_desc_t *, struct file *, |
174 | loff_t *, int, size_t, read_actor_t, | 174 | loff_t *, int, size_t, read_actor_t, |
175 | void *, struct cred *); | 175 | void *, struct cred *); |
176 | typedef ssize_t (*vop_splice_read_t)(bhv_desc_t *, struct file *, | ||
177 | struct inode *, size_t, int, int, | ||
178 | struct cred *); | ||
179 | typedef ssize_t (*vop_splice_write_t)(bhv_desc_t *, struct inode *, | ||
180 | struct file *, size_t, int, int, | ||
181 | struct cred *); | ||
176 | typedef int (*vop_ioctl_t)(bhv_desc_t *, struct inode *, struct file *, | 182 | typedef int (*vop_ioctl_t)(bhv_desc_t *, struct inode *, struct file *, |
177 | int, unsigned int, void __user *); | 183 | int, unsigned int, void __user *); |
178 | typedef int (*vop_getattr_t)(bhv_desc_t *, struct vattr *, int, | 184 | typedef int (*vop_getattr_t)(bhv_desc_t *, struct vattr *, int, |
@@ -231,6 +237,8 @@ typedef struct vnodeops { | |||
231 | vop_read_t vop_read; | 237 | vop_read_t vop_read; |
232 | vop_write_t vop_write; | 238 | vop_write_t vop_write; |
233 | vop_sendfile_t vop_sendfile; | 239 | vop_sendfile_t vop_sendfile; |
240 | vop_splice_read_t vop_splice_read; | ||
241 | vop_splice_write_t vop_splice_write; | ||
234 | vop_ioctl_t vop_ioctl; | 242 | vop_ioctl_t vop_ioctl; |
235 | vop_getattr_t vop_getattr; | 243 | vop_getattr_t vop_getattr; |
236 | vop_setattr_t vop_setattr; | 244 | vop_setattr_t vop_setattr; |
@@ -276,6 +284,10 @@ typedef struct vnodeops { | |||
276 | rv = _VOP_(vop_write, vp)((vp)->v_fbhv,file,iov,segs,offset,ioflags,cr) | 284 | rv = _VOP_(vop_write, vp)((vp)->v_fbhv,file,iov,segs,offset,ioflags,cr) |
277 | #define VOP_SENDFILE(vp,f,off,ioflags,cnt,act,targ,cr,rv) \ | 285 | #define VOP_SENDFILE(vp,f,off,ioflags,cnt,act,targ,cr,rv) \ |
278 | rv = _VOP_(vop_sendfile, vp)((vp)->v_fbhv,f,off,ioflags,cnt,act,targ,cr) | 286 | rv = _VOP_(vop_sendfile, vp)((vp)->v_fbhv,f,off,ioflags,cnt,act,targ,cr) |
287 | #define VOP_SPLICE_READ(vp,f,pipe,cnt,fl,iofl,cr,rv) \ | ||
288 | rv = _VOP_(vop_splice_read, vp)((vp)->v_fbhv,f,pipe,cnt,fl,iofl,cr) | ||
289 | #define VOP_SPLICE_WRITE(vp,f,pipe,cnt,fl,iofl,cr,rv) \ | ||
290 | rv = _VOP_(vop_splice_write, vp)((vp)->v_fbhv,f,pipe,cnt,fl,iofl,cr) | ||
279 | #define VOP_BMAP(vp,of,sz,rw,b,n,rv) \ | 291 | #define VOP_BMAP(vp,of,sz,rw,b,n,rv) \ |
280 | rv = _VOP_(vop_bmap, vp)((vp)->v_fbhv,of,sz,rw,b,n) | 292 | rv = _VOP_(vop_bmap, vp)((vp)->v_fbhv,of,sz,rw,b,n) |
281 | #define VOP_OPEN(vp, cr, rv) \ | 293 | #define VOP_OPEN(vp, cr, rv) \ |
diff --git a/fs/xfs/quota/xfs_qm.c b/fs/xfs/quota/xfs_qm.c index 73c1e5e80c07..7fb5eca9bd50 100644 --- a/fs/xfs/quota/xfs_qm.c +++ b/fs/xfs/quota/xfs_qm.c | |||
@@ -2624,7 +2624,7 @@ xfs_qm_vop_chown_reserve( | |||
2624 | { | 2624 | { |
2625 | int error; | 2625 | int error; |
2626 | xfs_mount_t *mp; | 2626 | xfs_mount_t *mp; |
2627 | uint delblks, blkflags; | 2627 | uint delblks, blkflags, prjflags = 0; |
2628 | xfs_dquot_t *unresudq, *unresgdq, *delblksudq, *delblksgdq; | 2628 | xfs_dquot_t *unresudq, *unresgdq, *delblksudq, *delblksgdq; |
2629 | 2629 | ||
2630 | ASSERT(XFS_ISLOCKED_INODE(ip)); | 2630 | ASSERT(XFS_ISLOCKED_INODE(ip)); |
@@ -2650,10 +2650,13 @@ xfs_qm_vop_chown_reserve( | |||
2650 | } | 2650 | } |
2651 | } | 2651 | } |
2652 | if (XFS_IS_OQUOTA_ON(ip->i_mount) && gdqp) { | 2652 | if (XFS_IS_OQUOTA_ON(ip->i_mount) && gdqp) { |
2653 | if ((XFS_IS_GQUOTA_ON(ip->i_mount) && | 2653 | if (XFS_IS_PQUOTA_ON(ip->i_mount) && |
2654 | ip->i_d.di_gid != be32_to_cpu(gdqp->q_core.d_id)) || | 2654 | ip->i_d.di_projid != be32_to_cpu(gdqp->q_core.d_id)) |
2655 | (XFS_IS_PQUOTA_ON(ip->i_mount) && | 2655 | prjflags = XFS_QMOPT_ENOSPC; |
2656 | ip->i_d.di_projid != be32_to_cpu(gdqp->q_core.d_id))) { | 2656 | |
2657 | if (prjflags || | ||
2658 | (XFS_IS_GQUOTA_ON(ip->i_mount) && | ||
2659 | ip->i_d.di_gid != be32_to_cpu(gdqp->q_core.d_id))) { | ||
2657 | delblksgdq = gdqp; | 2660 | delblksgdq = gdqp; |
2658 | if (delblks) { | 2661 | if (delblks) { |
2659 | ASSERT(ip->i_gdquot); | 2662 | ASSERT(ip->i_gdquot); |
@@ -2664,7 +2667,7 @@ xfs_qm_vop_chown_reserve( | |||
2664 | 2667 | ||
2665 | if ((error = xfs_trans_reserve_quota_bydquots(tp, ip->i_mount, | 2668 | if ((error = xfs_trans_reserve_quota_bydquots(tp, ip->i_mount, |
2666 | delblksudq, delblksgdq, ip->i_d.di_nblocks, 1, | 2669 | delblksudq, delblksgdq, ip->i_d.di_nblocks, 1, |
2667 | flags | blkflags))) | 2670 | flags | blkflags | prjflags))) |
2668 | return (error); | 2671 | return (error); |
2669 | 2672 | ||
2670 | /* | 2673 | /* |
@@ -2681,7 +2684,7 @@ xfs_qm_vop_chown_reserve( | |||
2681 | ASSERT(unresudq || unresgdq); | 2684 | ASSERT(unresudq || unresgdq); |
2682 | if ((error = xfs_trans_reserve_quota_bydquots(NULL, ip->i_mount, | 2685 | if ((error = xfs_trans_reserve_quota_bydquots(NULL, ip->i_mount, |
2683 | delblksudq, delblksgdq, (xfs_qcnt_t)delblks, 0, | 2686 | delblksudq, delblksgdq, (xfs_qcnt_t)delblks, 0, |
2684 | flags | blkflags))) | 2687 | flags | blkflags | prjflags))) |
2685 | return (error); | 2688 | return (error); |
2686 | xfs_trans_reserve_quota_bydquots(NULL, ip->i_mount, | 2689 | xfs_trans_reserve_quota_bydquots(NULL, ip->i_mount, |
2687 | unresudq, unresgdq, -((xfs_qcnt_t)delblks), 0, | 2690 | unresudq, unresgdq, -((xfs_qcnt_t)delblks), 0, |
diff --git a/fs/xfs/quota/xfs_trans_dquot.c b/fs/xfs/quota/xfs_trans_dquot.c index d8e131ec0aa8..9168918db252 100644 --- a/fs/xfs/quota/xfs_trans_dquot.c +++ b/fs/xfs/quota/xfs_trans_dquot.c | |||
@@ -595,12 +595,19 @@ xfs_trans_unreserve_and_mod_dquots( | |||
595 | } | 595 | } |
596 | } | 596 | } |
597 | 597 | ||
598 | STATIC int | ||
599 | xfs_quota_error(uint flags) | ||
600 | { | ||
601 | if (flags & XFS_QMOPT_ENOSPC) | ||
602 | return ENOSPC; | ||
603 | return EDQUOT; | ||
604 | } | ||
605 | |||
598 | /* | 606 | /* |
599 | * This reserves disk blocks and inodes against a dquot. | 607 | * This reserves disk blocks and inodes against a dquot. |
600 | * Flags indicate if the dquot is to be locked here and also | 608 | * Flags indicate if the dquot is to be locked here and also |
601 | * if the blk reservation is for RT or regular blocks. | 609 | * if the blk reservation is for RT or regular blocks. |
602 | * Sending in XFS_QMOPT_FORCE_RES flag skips the quota check. | 610 | * Sending in XFS_QMOPT_FORCE_RES flag skips the quota check. |
603 | * Returns EDQUOT if quota is exceeded. | ||
604 | */ | 611 | */ |
605 | STATIC int | 612 | STATIC int |
606 | xfs_trans_dqresv( | 613 | xfs_trans_dqresv( |
@@ -666,19 +673,15 @@ xfs_trans_dqresv( | |||
666 | */ | 673 | */ |
667 | if (hardlimit > 0ULL && | 674 | if (hardlimit > 0ULL && |
668 | (hardlimit <= nblks + *resbcountp)) { | 675 | (hardlimit <= nblks + *resbcountp)) { |
669 | error = EDQUOT; | 676 | error = xfs_quota_error(flags); |
670 | goto error_return; | 677 | goto error_return; |
671 | } | 678 | } |
672 | 679 | ||
673 | if (softlimit > 0ULL && | 680 | if (softlimit > 0ULL && |
674 | (softlimit <= nblks + *resbcountp)) { | 681 | (softlimit <= nblks + *resbcountp)) { |
675 | /* | ||
676 | * If timer or warnings has expired, | ||
677 | * return EDQUOT | ||
678 | */ | ||
679 | if ((timer != 0 && get_seconds() > timer) || | 682 | if ((timer != 0 && get_seconds() > timer) || |
680 | (warns != 0 && warns >= warnlimit)) { | 683 | (warns != 0 && warns >= warnlimit)) { |
681 | error = EDQUOT; | 684 | error = xfs_quota_error(flags); |
682 | goto error_return; | 685 | goto error_return; |
683 | } | 686 | } |
684 | } | 687 | } |
@@ -695,16 +698,12 @@ xfs_trans_dqresv( | |||
695 | if (!softlimit) | 698 | if (!softlimit) |
696 | softlimit = q->qi_isoftlimit; | 699 | softlimit = q->qi_isoftlimit; |
697 | if (hardlimit > 0ULL && count >= hardlimit) { | 700 | if (hardlimit > 0ULL && count >= hardlimit) { |
698 | error = EDQUOT; | 701 | error = xfs_quota_error(flags); |
699 | goto error_return; | 702 | goto error_return; |
700 | } else if (softlimit > 0ULL && count >= softlimit) { | 703 | } else if (softlimit > 0ULL && count >= softlimit) { |
701 | /* | ||
702 | * If timer or warnings has expired, | ||
703 | * return EDQUOT | ||
704 | */ | ||
705 | if ((timer != 0 && get_seconds() > timer) || | 704 | if ((timer != 0 && get_seconds() > timer) || |
706 | (warns != 0 && warns >= warnlimit)) { | 705 | (warns != 0 && warns >= warnlimit)) { |
707 | error = EDQUOT; | 706 | error = xfs_quota_error(flags); |
708 | goto error_return; | 707 | goto error_return; |
709 | } | 708 | } |
710 | } | 709 | } |
@@ -751,13 +750,14 @@ error_return: | |||
751 | 750 | ||
752 | 751 | ||
753 | /* | 752 | /* |
754 | * Given a dquot(s), make disk block and/or inode reservations against them. | 753 | * Given dquot(s), make disk block and/or inode reservations against them. |
755 | * The fact that this does the reservation against both the usr and | 754 | * The fact that this does the reservation against both the usr and |
756 | * grp quotas is important, because this follows a both-or-nothing | 755 | * grp/prj quotas is important, because this follows a both-or-nothing |
757 | * approach. | 756 | * approach. |
758 | * | 757 | * |
759 | * flags = XFS_QMOPT_DQLOCK indicate if dquot(s) need to be locked. | 758 | * flags = XFS_QMOPT_DQLOCK indicate if dquot(s) need to be locked. |
760 | * XFS_QMOPT_FORCE_RES evades limit enforcement. Used by chown. | 759 | * XFS_QMOPT_FORCE_RES evades limit enforcement. Used by chown. |
760 | * XFS_QMOPT_ENOSPC returns ENOSPC not EDQUOT. Used by pquota. | ||
761 | * XFS_TRANS_DQ_RES_BLKS reserves regular disk blocks | 761 | * XFS_TRANS_DQ_RES_BLKS reserves regular disk blocks |
762 | * XFS_TRANS_DQ_RES_RTBLKS reserves realtime disk blocks | 762 | * XFS_TRANS_DQ_RES_RTBLKS reserves realtime disk blocks |
763 | * dquots are unlocked on return, if they were not locked by caller. | 763 | * dquots are unlocked on return, if they were not locked by caller. |
@@ -772,25 +772,27 @@ xfs_trans_reserve_quota_bydquots( | |||
772 | long ninos, | 772 | long ninos, |
773 | uint flags) | 773 | uint flags) |
774 | { | 774 | { |
775 | int resvd; | 775 | int resvd = 0, error; |
776 | 776 | ||
777 | if (! XFS_IS_QUOTA_ON(mp)) | 777 | if (!XFS_IS_QUOTA_ON(mp)) |
778 | return (0); | 778 | return 0; |
779 | 779 | ||
780 | if (tp && tp->t_dqinfo == NULL) | 780 | if (tp && tp->t_dqinfo == NULL) |
781 | xfs_trans_alloc_dqinfo(tp); | 781 | xfs_trans_alloc_dqinfo(tp); |
782 | 782 | ||
783 | ASSERT(flags & XFS_QMOPT_RESBLK_MASK); | 783 | ASSERT(flags & XFS_QMOPT_RESBLK_MASK); |
784 | resvd = 0; | ||
785 | 784 | ||
786 | if (udqp) { | 785 | if (udqp) { |
787 | if (xfs_trans_dqresv(tp, mp, udqp, nblks, ninos, flags)) | 786 | error = xfs_trans_dqresv(tp, mp, udqp, nblks, ninos, |
788 | return (EDQUOT); | 787 | (flags & ~XFS_QMOPT_ENOSPC)); |
788 | if (error) | ||
789 | return error; | ||
789 | resvd = 1; | 790 | resvd = 1; |
790 | } | 791 | } |
791 | 792 | ||
792 | if (gdqp) { | 793 | if (gdqp) { |
793 | if (xfs_trans_dqresv(tp, mp, gdqp, nblks, ninos, flags)) { | 794 | error = xfs_trans_dqresv(tp, mp, gdqp, nblks, ninos, flags); |
795 | if (error) { | ||
794 | /* | 796 | /* |
795 | * can't do it, so backout previous reservation | 797 | * can't do it, so backout previous reservation |
796 | */ | 798 | */ |
@@ -799,14 +801,14 @@ xfs_trans_reserve_quota_bydquots( | |||
799 | xfs_trans_dqresv(tp, mp, udqp, | 801 | xfs_trans_dqresv(tp, mp, udqp, |
800 | -nblks, -ninos, flags); | 802 | -nblks, -ninos, flags); |
801 | } | 803 | } |
802 | return (EDQUOT); | 804 | return error; |
803 | } | 805 | } |
804 | } | 806 | } |
805 | 807 | ||
806 | /* | 808 | /* |
807 | * Didn't change anything critical, so, no need to log | 809 | * Didn't change anything critical, so, no need to log |
808 | */ | 810 | */ |
809 | return (0); | 811 | return 0; |
810 | } | 812 | } |
811 | 813 | ||
812 | 814 | ||
@@ -814,8 +816,6 @@ xfs_trans_reserve_quota_bydquots( | |||
814 | * Lock the dquot and change the reservation if we can. | 816 | * Lock the dquot and change the reservation if we can. |
815 | * This doesn't change the actual usage, just the reservation. | 817 | * This doesn't change the actual usage, just the reservation. |
816 | * The inode sent in is locked. | 818 | * The inode sent in is locked. |
817 | * | ||
818 | * Returns 0 on success, EDQUOT or other errors otherwise | ||
819 | */ | 819 | */ |
820 | STATIC int | 820 | STATIC int |
821 | xfs_trans_reserve_quota_nblks( | 821 | xfs_trans_reserve_quota_nblks( |
@@ -824,20 +824,24 @@ xfs_trans_reserve_quota_nblks( | |||
824 | xfs_inode_t *ip, | 824 | xfs_inode_t *ip, |
825 | long nblks, | 825 | long nblks, |
826 | long ninos, | 826 | long ninos, |
827 | uint type) | 827 | uint flags) |
828 | { | 828 | { |
829 | int error; | 829 | int error; |
830 | 830 | ||
831 | if (!XFS_IS_QUOTA_ON(mp)) | 831 | if (!XFS_IS_QUOTA_ON(mp)) |
832 | return (0); | 832 | return 0; |
833 | if (XFS_IS_PQUOTA_ON(mp)) | ||
834 | flags |= XFS_QMOPT_ENOSPC; | ||
833 | 835 | ||
834 | ASSERT(ip->i_ino != mp->m_sb.sb_uquotino); | 836 | ASSERT(ip->i_ino != mp->m_sb.sb_uquotino); |
835 | ASSERT(ip->i_ino != mp->m_sb.sb_gquotino); | 837 | ASSERT(ip->i_ino != mp->m_sb.sb_gquotino); |
836 | 838 | ||
837 | ASSERT(XFS_ISLOCKED_INODE_EXCL(ip)); | 839 | ASSERT(XFS_ISLOCKED_INODE_EXCL(ip)); |
838 | ASSERT(XFS_IS_QUOTA_RUNNING(ip->i_mount)); | 840 | ASSERT(XFS_IS_QUOTA_RUNNING(ip->i_mount)); |
839 | ASSERT((type & ~XFS_QMOPT_FORCE_RES) == XFS_TRANS_DQ_RES_RTBLKS || | 841 | ASSERT((flags & ~(XFS_QMOPT_FORCE_RES | XFS_QMOPT_ENOSPC)) == |
840 | (type & ~XFS_QMOPT_FORCE_RES) == XFS_TRANS_DQ_RES_BLKS); | 842 | XFS_TRANS_DQ_RES_RTBLKS || |
843 | (flags & ~(XFS_QMOPT_FORCE_RES | XFS_QMOPT_ENOSPC)) == | ||
844 | XFS_TRANS_DQ_RES_BLKS); | ||
841 | 845 | ||
842 | /* | 846 | /* |
843 | * Reserve nblks against these dquots, with trans as the mediator. | 847 | * Reserve nblks against these dquots, with trans as the mediator. |
@@ -845,8 +849,8 @@ xfs_trans_reserve_quota_nblks( | |||
845 | error = xfs_trans_reserve_quota_bydquots(tp, mp, | 849 | error = xfs_trans_reserve_quota_bydquots(tp, mp, |
846 | ip->i_udquot, ip->i_gdquot, | 850 | ip->i_udquot, ip->i_gdquot, |
847 | nblks, ninos, | 851 | nblks, ninos, |
848 | type); | 852 | flags); |
849 | return (error); | 853 | return error; |
850 | } | 854 | } |
851 | 855 | ||
852 | /* | 856 | /* |
diff --git a/fs/xfs/xfs_bmap.c b/fs/xfs/xfs_bmap.c index d384e489705f..26939d364bc4 100644 --- a/fs/xfs/xfs_bmap.c +++ b/fs/xfs/xfs_bmap.c | |||
@@ -4719,18 +4719,17 @@ xfs_bmapi( | |||
4719 | /* | 4719 | /* |
4720 | * Make a transaction-less quota reservation for | 4720 | * Make a transaction-less quota reservation for |
4721 | * delayed allocation blocks. This number gets | 4721 | * delayed allocation blocks. This number gets |
4722 | * adjusted later. | 4722 | * adjusted later. We return if we haven't |
4723 | * We return EDQUOT if we haven't allocated | 4723 | * allocated blocks already inside this loop. |
4724 | * blks already inside this loop; | ||
4725 | */ | 4724 | */ |
4726 | if (XFS_TRANS_RESERVE_QUOTA_NBLKS( | 4725 | if ((error = XFS_TRANS_RESERVE_QUOTA_NBLKS( |
4727 | mp, NULL, ip, (long)alen, 0, | 4726 | mp, NULL, ip, (long)alen, 0, |
4728 | rt ? XFS_QMOPT_RES_RTBLKS : | 4727 | rt ? XFS_QMOPT_RES_RTBLKS : |
4729 | XFS_QMOPT_RES_REGBLKS)) { | 4728 | XFS_QMOPT_RES_REGBLKS))) { |
4730 | if (n == 0) { | 4729 | if (n == 0) { |
4731 | *nmap = 0; | 4730 | *nmap = 0; |
4732 | ASSERT(cur == NULL); | 4731 | ASSERT(cur == NULL); |
4733 | return XFS_ERROR(EDQUOT); | 4732 | return error; |
4734 | } | 4733 | } |
4735 | break; | 4734 | break; |
4736 | } | 4735 | } |
diff --git a/fs/xfs/xfs_bmap.h b/fs/xfs/xfs_bmap.h index f83399c89ce3..8e0d73d9ccc4 100644 --- a/fs/xfs/xfs_bmap.h +++ b/fs/xfs/xfs_bmap.h | |||
@@ -353,10 +353,11 @@ xfs_check_nostate_extents( | |||
353 | xfs_extnum_t num); | 353 | xfs_extnum_t num); |
354 | 354 | ||
355 | /* | 355 | /* |
356 | * Call xfs_bmap_do_search_extents() to search for the extent | 356 | * Search the extent records for the entry containing block bno. |
357 | * record containing block bno. If in multi-level in-core extent | 357 | * If bno lies in a hole, point to the next entry. If bno lies |
358 | * allocation mode, find and extract the target extent buffer, | 358 | * past eof, *eofp will be set, and *prevp will contain the last |
359 | * otherwise just use the direct extent list. | 359 | * entry (null if none). Else, *lastxp will be set to the index |
360 | * of the found entry; *gotp will contain the entry. | ||
360 | */ | 361 | */ |
361 | xfs_bmbt_rec_t * | 362 | xfs_bmbt_rec_t * |
362 | xfs_bmap_search_multi_extents(struct xfs_ifork *, xfs_fileoff_t, int *, | 363 | xfs_bmap_search_multi_extents(struct xfs_ifork *, xfs_fileoff_t, int *, |
diff --git a/fs/xfs/xfs_clnt.h b/fs/xfs/xfs_clnt.h index 022fff62085b..5b7eb81453be 100644 --- a/fs/xfs/xfs_clnt.h +++ b/fs/xfs/xfs_clnt.h | |||
@@ -68,6 +68,7 @@ struct xfs_mount_args { | |||
68 | * enforcement */ | 68 | * enforcement */ |
69 | #define XFSMNT_PQUOTAENF 0x00000040 /* IRIX project quota limit | 69 | #define XFSMNT_PQUOTAENF 0x00000040 /* IRIX project quota limit |
70 | * enforcement */ | 70 | * enforcement */ |
71 | #define XFSMNT_QUIET 0x00000080 /* don't report mount errors */ | ||
71 | #define XFSMNT_NOALIGN 0x00000200 /* don't allocate at | 72 | #define XFSMNT_NOALIGN 0x00000200 /* don't allocate at |
72 | * stripe boundaries*/ | 73 | * stripe boundaries*/ |
73 | #define XFSMNT_RETERR 0x00000400 /* return error to user */ | 74 | #define XFSMNT_RETERR 0x00000400 /* return error to user */ |
diff --git a/fs/xfs/xfs_error.h b/fs/xfs/xfs_error.h index 26b8e709a569..bc43163456ef 100644 --- a/fs/xfs/xfs_error.h +++ b/fs/xfs/xfs_error.h | |||
@@ -186,4 +186,7 @@ extern void xfs_fs_cmn_err(int level, struct xfs_mount *mp, char *fmt, ...); | |||
186 | #define xfs_fs_repair_cmn_err(level, mp, fmt, args...) \ | 186 | #define xfs_fs_repair_cmn_err(level, mp, fmt, args...) \ |
187 | xfs_fs_cmn_err(level, mp, fmt " Unmount and run xfs_repair.", ## args) | 187 | xfs_fs_cmn_err(level, mp, fmt " Unmount and run xfs_repair.", ## args) |
188 | 188 | ||
189 | #define xfs_fs_mount_cmn_err(f, fmt, args...) \ | ||
190 | ((f & XFS_MFSI_QUIET)? cmn_err(CE_WARN, "XFS: " fmt, ## args) : (void)0) | ||
191 | |||
189 | #endif /* __XFS_ERROR_H__ */ | 192 | #endif /* __XFS_ERROR_H__ */ |
diff --git a/fs/xfs/xfs_mount.c b/fs/xfs/xfs_mount.c index 72e7e78bfff8..049fabb7f7e0 100644 --- a/fs/xfs/xfs_mount.c +++ b/fs/xfs/xfs_mount.c | |||
@@ -213,7 +213,8 @@ xfs_mount_free( | |||
213 | STATIC int | 213 | STATIC int |
214 | xfs_mount_validate_sb( | 214 | xfs_mount_validate_sb( |
215 | xfs_mount_t *mp, | 215 | xfs_mount_t *mp, |
216 | xfs_sb_t *sbp) | 216 | xfs_sb_t *sbp, |
217 | int flags) | ||
217 | { | 218 | { |
218 | /* | 219 | /* |
219 | * If the log device and data device have the | 220 | * If the log device and data device have the |
@@ -223,33 +224,29 @@ xfs_mount_validate_sb( | |||
223 | * a volume filesystem in a non-volume manner. | 224 | * a volume filesystem in a non-volume manner. |
224 | */ | 225 | */ |
225 | if (sbp->sb_magicnum != XFS_SB_MAGIC) { | 226 | if (sbp->sb_magicnum != XFS_SB_MAGIC) { |
226 | cmn_err(CE_WARN, "XFS: bad magic number"); | 227 | xfs_fs_mount_cmn_err(flags, "bad magic number"); |
227 | return XFS_ERROR(EWRONGFS); | 228 | return XFS_ERROR(EWRONGFS); |
228 | } | 229 | } |
229 | 230 | ||
230 | if (!XFS_SB_GOOD_VERSION(sbp)) { | 231 | if (!XFS_SB_GOOD_VERSION(sbp)) { |
231 | cmn_err(CE_WARN, "XFS: bad version"); | 232 | xfs_fs_mount_cmn_err(flags, "bad version"); |
232 | return XFS_ERROR(EWRONGFS); | 233 | return XFS_ERROR(EWRONGFS); |
233 | } | 234 | } |
234 | 235 | ||
235 | if (unlikely( | 236 | if (unlikely( |
236 | sbp->sb_logstart == 0 && mp->m_logdev_targp == mp->m_ddev_targp)) { | 237 | sbp->sb_logstart == 0 && mp->m_logdev_targp == mp->m_ddev_targp)) { |
237 | cmn_err(CE_WARN, | 238 | xfs_fs_mount_cmn_err(flags, |
238 | "XFS: filesystem is marked as having an external log; " | 239 | "filesystem is marked as having an external log; " |
239 | "specify logdev on the\nmount command line."); | 240 | "specify logdev on the\nmount command line."); |
240 | XFS_CORRUPTION_ERROR("xfs_mount_validate_sb(1)", | 241 | return XFS_ERROR(EINVAL); |
241 | XFS_ERRLEVEL_HIGH, mp, sbp); | ||
242 | return XFS_ERROR(EFSCORRUPTED); | ||
243 | } | 242 | } |
244 | 243 | ||
245 | if (unlikely( | 244 | if (unlikely( |
246 | sbp->sb_logstart != 0 && mp->m_logdev_targp != mp->m_ddev_targp)) { | 245 | sbp->sb_logstart != 0 && mp->m_logdev_targp != mp->m_ddev_targp)) { |
247 | cmn_err(CE_WARN, | 246 | xfs_fs_mount_cmn_err(flags, |
248 | "XFS: filesystem is marked as having an internal log; " | 247 | "filesystem is marked as having an internal log; " |
249 | "don't specify logdev on\nthe mount command line."); | 248 | "do not specify logdev on\nthe mount command line."); |
250 | XFS_CORRUPTION_ERROR("xfs_mount_validate_sb(2)", | 249 | return XFS_ERROR(EINVAL); |
251 | XFS_ERRLEVEL_HIGH, mp, sbp); | ||
252 | return XFS_ERROR(EFSCORRUPTED); | ||
253 | } | 250 | } |
254 | 251 | ||
255 | /* | 252 | /* |
@@ -274,9 +271,7 @@ xfs_mount_validate_sb( | |||
274 | (sbp->sb_rextsize * sbp->sb_blocksize > XFS_MAX_RTEXTSIZE) || | 271 | (sbp->sb_rextsize * sbp->sb_blocksize > XFS_MAX_RTEXTSIZE) || |
275 | (sbp->sb_rextsize * sbp->sb_blocksize < XFS_MIN_RTEXTSIZE) || | 272 | (sbp->sb_rextsize * sbp->sb_blocksize < XFS_MIN_RTEXTSIZE) || |
276 | (sbp->sb_imax_pct > 100 || sbp->sb_imax_pct < 1))) { | 273 | (sbp->sb_imax_pct > 100 || sbp->sb_imax_pct < 1))) { |
277 | cmn_err(CE_WARN, "XFS: SB sanity check 1 failed"); | 274 | xfs_fs_mount_cmn_err(flags, "SB sanity check 1 failed"); |
278 | XFS_CORRUPTION_ERROR("xfs_mount_validate_sb(3)", | ||
279 | XFS_ERRLEVEL_LOW, mp, sbp); | ||
280 | return XFS_ERROR(EFSCORRUPTED); | 275 | return XFS_ERROR(EFSCORRUPTED); |
281 | } | 276 | } |
282 | 277 | ||
@@ -289,9 +284,7 @@ xfs_mount_validate_sb( | |||
289 | (xfs_drfsbno_t)sbp->sb_agcount * sbp->sb_agblocks || | 284 | (xfs_drfsbno_t)sbp->sb_agcount * sbp->sb_agblocks || |
290 | sbp->sb_dblocks < (xfs_drfsbno_t)(sbp->sb_agcount - 1) * | 285 | sbp->sb_dblocks < (xfs_drfsbno_t)(sbp->sb_agcount - 1) * |
291 | sbp->sb_agblocks + XFS_MIN_AG_BLOCKS)) { | 286 | sbp->sb_agblocks + XFS_MIN_AG_BLOCKS)) { |
292 | cmn_err(CE_WARN, "XFS: SB sanity check 2 failed"); | 287 | xfs_fs_mount_cmn_err(flags, "SB sanity check 2 failed"); |
293 | XFS_ERROR_REPORT("xfs_mount_validate_sb(4)", | ||
294 | XFS_ERRLEVEL_LOW, mp); | ||
295 | return XFS_ERROR(EFSCORRUPTED); | 288 | return XFS_ERROR(EFSCORRUPTED); |
296 | } | 289 | } |
297 | 290 | ||
@@ -307,15 +300,13 @@ xfs_mount_validate_sb( | |||
307 | (sbp->sb_dblocks << (sbp->sb_blocklog - BBSHIFT)) > UINT_MAX || | 300 | (sbp->sb_dblocks << (sbp->sb_blocklog - BBSHIFT)) > UINT_MAX || |
308 | (sbp->sb_rblocks << (sbp->sb_blocklog - BBSHIFT)) > UINT_MAX)) { | 301 | (sbp->sb_rblocks << (sbp->sb_blocklog - BBSHIFT)) > UINT_MAX)) { |
309 | #endif | 302 | #endif |
310 | cmn_err(CE_WARN, | 303 | xfs_fs_mount_cmn_err(flags, |
311 | "XFS: File system is too large to be mounted on this system."); | 304 | "file system too large to be mounted on this system."); |
312 | return XFS_ERROR(E2BIG); | 305 | return XFS_ERROR(E2BIG); |
313 | } | 306 | } |
314 | 307 | ||
315 | if (unlikely(sbp->sb_inprogress)) { | 308 | if (unlikely(sbp->sb_inprogress)) { |
316 | cmn_err(CE_WARN, "XFS: file system busy"); | 309 | xfs_fs_mount_cmn_err(flags, "file system busy"); |
317 | XFS_ERROR_REPORT("xfs_mount_validate_sb(5)", | ||
318 | XFS_ERRLEVEL_LOW, mp); | ||
319 | return XFS_ERROR(EFSCORRUPTED); | 310 | return XFS_ERROR(EFSCORRUPTED); |
320 | } | 311 | } |
321 | 312 | ||
@@ -323,8 +314,8 @@ xfs_mount_validate_sb( | |||
323 | * Version 1 directory format has never worked on Linux. | 314 | * Version 1 directory format has never worked on Linux. |
324 | */ | 315 | */ |
325 | if (unlikely(!XFS_SB_VERSION_HASDIRV2(sbp))) { | 316 | if (unlikely(!XFS_SB_VERSION_HASDIRV2(sbp))) { |
326 | cmn_err(CE_WARN, | 317 | xfs_fs_mount_cmn_err(flags, |
327 | "XFS: Attempted to mount file system using version 1 directory format"); | 318 | "file system using version 1 directory format"); |
328 | return XFS_ERROR(ENOSYS); | 319 | return XFS_ERROR(ENOSYS); |
329 | } | 320 | } |
330 | 321 | ||
@@ -332,11 +323,11 @@ xfs_mount_validate_sb( | |||
332 | * Until this is fixed only page-sized or smaller data blocks work. | 323 | * Until this is fixed only page-sized or smaller data blocks work. |
333 | */ | 324 | */ |
334 | if (unlikely(sbp->sb_blocksize > PAGE_SIZE)) { | 325 | if (unlikely(sbp->sb_blocksize > PAGE_SIZE)) { |
335 | cmn_err(CE_WARN, | 326 | xfs_fs_mount_cmn_err(flags, |
336 | "XFS: Attempted to mount file system with blocksize %d bytes", | 327 | "file system with blocksize %d bytes", |
337 | sbp->sb_blocksize); | 328 | sbp->sb_blocksize); |
338 | cmn_err(CE_WARN, | 329 | xfs_fs_mount_cmn_err(flags, |
339 | "XFS: Only page-sized (%ld) or less blocksizes currently work.", | 330 | "only pagesize (%ld) or less will currently work.", |
340 | PAGE_SIZE); | 331 | PAGE_SIZE); |
341 | return XFS_ERROR(ENOSYS); | 332 | return XFS_ERROR(ENOSYS); |
342 | } | 333 | } |
@@ -484,7 +475,7 @@ xfs_xlatesb( | |||
484 | * Does the initial read of the superblock. | 475 | * Does the initial read of the superblock. |
485 | */ | 476 | */ |
486 | int | 477 | int |
487 | xfs_readsb(xfs_mount_t *mp) | 478 | xfs_readsb(xfs_mount_t *mp, int flags) |
488 | { | 479 | { |
489 | unsigned int sector_size; | 480 | unsigned int sector_size; |
490 | unsigned int extra_flags; | 481 | unsigned int extra_flags; |
@@ -506,7 +497,7 @@ xfs_readsb(xfs_mount_t *mp) | |||
506 | bp = xfs_buf_read_flags(mp->m_ddev_targp, XFS_SB_DADDR, | 497 | bp = xfs_buf_read_flags(mp->m_ddev_targp, XFS_SB_DADDR, |
507 | BTOBB(sector_size), extra_flags); | 498 | BTOBB(sector_size), extra_flags); |
508 | if (!bp || XFS_BUF_ISERROR(bp)) { | 499 | if (!bp || XFS_BUF_ISERROR(bp)) { |
509 | cmn_err(CE_WARN, "XFS: SB read failed"); | 500 | xfs_fs_mount_cmn_err(flags, "SB read failed"); |
510 | error = bp ? XFS_BUF_GETERROR(bp) : ENOMEM; | 501 | error = bp ? XFS_BUF_GETERROR(bp) : ENOMEM; |
511 | goto fail; | 502 | goto fail; |
512 | } | 503 | } |
@@ -520,9 +511,9 @@ xfs_readsb(xfs_mount_t *mp) | |||
520 | sbp = XFS_BUF_TO_SBP(bp); | 511 | sbp = XFS_BUF_TO_SBP(bp); |
521 | xfs_xlatesb(XFS_BUF_PTR(bp), &(mp->m_sb), 1, XFS_SB_ALL_BITS); | 512 | xfs_xlatesb(XFS_BUF_PTR(bp), &(mp->m_sb), 1, XFS_SB_ALL_BITS); |
522 | 513 | ||
523 | error = xfs_mount_validate_sb(mp, &(mp->m_sb)); | 514 | error = xfs_mount_validate_sb(mp, &(mp->m_sb), flags); |
524 | if (error) { | 515 | if (error) { |
525 | cmn_err(CE_WARN, "XFS: SB validate failed"); | 516 | xfs_fs_mount_cmn_err(flags, "SB validate failed"); |
526 | goto fail; | 517 | goto fail; |
527 | } | 518 | } |
528 | 519 | ||
@@ -530,8 +521,8 @@ xfs_readsb(xfs_mount_t *mp) | |||
530 | * We must be able to do sector-sized and sector-aligned IO. | 521 | * We must be able to do sector-sized and sector-aligned IO. |
531 | */ | 522 | */ |
532 | if (sector_size > mp->m_sb.sb_sectsize) { | 523 | if (sector_size > mp->m_sb.sb_sectsize) { |
533 | cmn_err(CE_WARN, | 524 | xfs_fs_mount_cmn_err(flags, |
534 | "XFS: device supports only %u byte sectors (not %u)", | 525 | "device supports only %u byte sectors (not %u)", |
535 | sector_size, mp->m_sb.sb_sectsize); | 526 | sector_size, mp->m_sb.sb_sectsize); |
536 | error = ENOSYS; | 527 | error = ENOSYS; |
537 | goto fail; | 528 | goto fail; |
@@ -548,7 +539,7 @@ xfs_readsb(xfs_mount_t *mp) | |||
548 | bp = xfs_buf_read_flags(mp->m_ddev_targp, XFS_SB_DADDR, | 539 | bp = xfs_buf_read_flags(mp->m_ddev_targp, XFS_SB_DADDR, |
549 | BTOBB(sector_size), extra_flags); | 540 | BTOBB(sector_size), extra_flags); |
550 | if (!bp || XFS_BUF_ISERROR(bp)) { | 541 | if (!bp || XFS_BUF_ISERROR(bp)) { |
551 | cmn_err(CE_WARN, "XFS: SB re-read failed"); | 542 | xfs_fs_mount_cmn_err(flags, "SB re-read failed"); |
552 | error = bp ? XFS_BUF_GETERROR(bp) : ENOMEM; | 543 | error = bp ? XFS_BUF_GETERROR(bp) : ENOMEM; |
553 | goto fail; | 544 | goto fail; |
554 | } | 545 | } |
@@ -678,7 +669,7 @@ xfs_mountfs( | |||
678 | int error = 0; | 669 | int error = 0; |
679 | 670 | ||
680 | if (mp->m_sb_bp == NULL) { | 671 | if (mp->m_sb_bp == NULL) { |
681 | if ((error = xfs_readsb(mp))) { | 672 | if ((error = xfs_readsb(mp, mfsi_flags))) { |
682 | return error; | 673 | return error; |
683 | } | 674 | } |
684 | } | 675 | } |
diff --git a/fs/xfs/xfs_mount.h b/fs/xfs/xfs_mount.h index 66cbee79864e..668ad23fd37c 100644 --- a/fs/xfs/xfs_mount.h +++ b/fs/xfs/xfs_mount.h | |||
@@ -510,9 +510,12 @@ xfs_preferred_iosize(xfs_mount_t *mp) | |||
510 | */ | 510 | */ |
511 | #define XFS_MFSI_SECOND 0x01 /* Secondary mount -- skip stuff */ | 511 | #define XFS_MFSI_SECOND 0x01 /* Secondary mount -- skip stuff */ |
512 | #define XFS_MFSI_CLIENT 0x02 /* Is a client -- skip lots of stuff */ | 512 | #define XFS_MFSI_CLIENT 0x02 /* Is a client -- skip lots of stuff */ |
513 | /* XFS_MFSI_RRINODES */ | ||
513 | #define XFS_MFSI_NOUNLINK 0x08 /* Skip unlinked inode processing in */ | 514 | #define XFS_MFSI_NOUNLINK 0x08 /* Skip unlinked inode processing in */ |
514 | /* log recovery */ | 515 | /* log recovery */ |
515 | #define XFS_MFSI_NO_QUOTACHECK 0x10 /* Skip quotacheck processing */ | 516 | #define XFS_MFSI_NO_QUOTACHECK 0x10 /* Skip quotacheck processing */ |
517 | /* XFS_MFSI_CONVERT_SUNIT */ | ||
518 | #define XFS_MFSI_QUIET 0x40 /* Be silent if mount errors found */ | ||
516 | 519 | ||
517 | /* | 520 | /* |
518 | * Macros for getting from mount to vfs and back. | 521 | * Macros for getting from mount to vfs and back. |
@@ -581,7 +584,7 @@ extern int xfs_mod_incore_sb_unlocked(xfs_mount_t *, xfs_sb_field_t, | |||
581 | extern int xfs_mod_incore_sb_batch(xfs_mount_t *, xfs_mod_sb_t *, | 584 | extern int xfs_mod_incore_sb_batch(xfs_mount_t *, xfs_mod_sb_t *, |
582 | uint, int); | 585 | uint, int); |
583 | extern struct xfs_buf *xfs_getsb(xfs_mount_t *, int); | 586 | extern struct xfs_buf *xfs_getsb(xfs_mount_t *, int); |
584 | extern int xfs_readsb(xfs_mount_t *mp); | 587 | extern int xfs_readsb(xfs_mount_t *, int); |
585 | extern void xfs_freesb(xfs_mount_t *); | 588 | extern void xfs_freesb(xfs_mount_t *); |
586 | extern void xfs_do_force_shutdown(bhv_desc_t *, int, char *, int); | 589 | extern void xfs_do_force_shutdown(bhv_desc_t *, int, char *, int); |
587 | extern int xfs_syncsub(xfs_mount_t *, int, int, int *); | 590 | extern int xfs_syncsub(xfs_mount_t *, int, int, int *); |
diff --git a/fs/xfs/xfs_quota.h b/fs/xfs/xfs_quota.h index 4f6a034de7f7..7fbef974bce6 100644 --- a/fs/xfs/xfs_quota.h +++ b/fs/xfs/xfs_quota.h | |||
@@ -196,10 +196,11 @@ typedef struct xfs_qoff_logformat { | |||
196 | #define XFS_QMOPT_QUOTAOFF 0x0000080 /* quotas are being turned off */ | 196 | #define XFS_QMOPT_QUOTAOFF 0x0000080 /* quotas are being turned off */ |
197 | #define XFS_QMOPT_UMOUNTING 0x0000100 /* filesys is being unmounted */ | 197 | #define XFS_QMOPT_UMOUNTING 0x0000100 /* filesys is being unmounted */ |
198 | #define XFS_QMOPT_DOLOG 0x0000200 /* log buf changes (in quotacheck) */ | 198 | #define XFS_QMOPT_DOLOG 0x0000200 /* log buf changes (in quotacheck) */ |
199 | #define XFS_QMOPT_DOWARN 0x0000400 /* increase warning cnt if necessary */ | 199 | #define XFS_QMOPT_DOWARN 0x0000400 /* increase warning cnt if needed */ |
200 | #define XFS_QMOPT_ILOCKED 0x0000800 /* inode is already locked (excl) */ | 200 | #define XFS_QMOPT_ILOCKED 0x0000800 /* inode is already locked (excl) */ |
201 | #define XFS_QMOPT_DQREPAIR 0x0001000 /* repair dquot, if damaged. */ | 201 | #define XFS_QMOPT_DQREPAIR 0x0001000 /* repair dquot if damaged */ |
202 | #define XFS_QMOPT_GQUOTA 0x0002000 /* group dquot requested */ | 202 | #define XFS_QMOPT_GQUOTA 0x0002000 /* group dquot requested */ |
203 | #define XFS_QMOPT_ENOSPC 0x0004000 /* enospc instead of edquot (prj) */ | ||
203 | 204 | ||
204 | /* | 205 | /* |
205 | * flags to xfs_trans_mod_dquot to indicate which field needs to be | 206 | * flags to xfs_trans_mod_dquot to indicate which field needs to be |
diff --git a/fs/xfs/xfs_vfsops.c b/fs/xfs/xfs_vfsops.c index 504d2a80747a..f0e09ca14139 100644 --- a/fs/xfs/xfs_vfsops.c +++ b/fs/xfs/xfs_vfsops.c | |||
@@ -442,6 +442,9 @@ xfs_mount( | |||
442 | p = vfs_bhv_lookup(vfsp, VFS_POSITION_IO); | 442 | p = vfs_bhv_lookup(vfsp, VFS_POSITION_IO); |
443 | mp->m_io_ops = p ? *(xfs_ioops_t *) vfs_bhv_custom(p) : xfs_iocore_xfs; | 443 | mp->m_io_ops = p ? *(xfs_ioops_t *) vfs_bhv_custom(p) : xfs_iocore_xfs; |
444 | 444 | ||
445 | if (args->flags & XFSMNT_QUIET) | ||
446 | flags |= XFS_MFSI_QUIET; | ||
447 | |||
445 | /* | 448 | /* |
446 | * Open real time and log devices - order is important. | 449 | * Open real time and log devices - order is important. |
447 | */ | 450 | */ |
@@ -492,7 +495,7 @@ xfs_mount( | |||
492 | error = xfs_start_flags(vfsp, args, mp); | 495 | error = xfs_start_flags(vfsp, args, mp); |
493 | if (error) | 496 | if (error) |
494 | goto error1; | 497 | goto error1; |
495 | error = xfs_readsb(mp); | 498 | error = xfs_readsb(mp, flags); |
496 | if (error) | 499 | if (error) |
497 | goto error1; | 500 | goto error1; |
498 | error = xfs_finish_flags(vfsp, args, mp); | 501 | error = xfs_finish_flags(vfsp, args, mp); |
@@ -1697,8 +1700,9 @@ xfs_parseargs( | |||
1697 | int dsunit, dswidth, vol_dsunit, vol_dswidth; | 1700 | int dsunit, dswidth, vol_dsunit, vol_dswidth; |
1698 | int iosize; | 1701 | int iosize; |
1699 | 1702 | ||
1700 | args->flags2 |= XFSMNT2_COMPAT_IOSIZE; | ||
1701 | args->flags |= XFSMNT_IDELETE; | 1703 | args->flags |= XFSMNT_IDELETE; |
1704 | args->flags |= XFSMNT_BARRIER; | ||
1705 | args->flags2 |= XFSMNT2_COMPAT_IOSIZE; | ||
1702 | 1706 | ||
1703 | if (!options) | 1707 | if (!options) |
1704 | goto done; | 1708 | goto done; |
@@ -1947,8 +1951,6 @@ xfs_showargs( | |||
1947 | seq_printf(m, "," MNTOPT_IKEEP); | 1951 | seq_printf(m, "," MNTOPT_IKEEP); |
1948 | if (!(mp->m_flags & XFS_MOUNT_COMPAT_IOSIZE)) | 1952 | if (!(mp->m_flags & XFS_MOUNT_COMPAT_IOSIZE)) |
1949 | seq_printf(m, "," MNTOPT_LARGEIO); | 1953 | seq_printf(m, "," MNTOPT_LARGEIO); |
1950 | if (mp->m_flags & XFS_MOUNT_BARRIER) | ||
1951 | seq_printf(m, "," MNTOPT_BARRIER); | ||
1952 | 1954 | ||
1953 | if (!(vfsp->vfs_flag & VFS_32BITINODES)) | 1955 | if (!(vfsp->vfs_flag & VFS_32BITINODES)) |
1954 | seq_printf(m, "," MNTOPT_64BITINODE); | 1956 | seq_printf(m, "," MNTOPT_64BITINODE); |
diff --git a/fs/xfs/xfs_vnodeops.c b/fs/xfs/xfs_vnodeops.c index de49601919c1..fa71b305ba5c 100644 --- a/fs/xfs/xfs_vnodeops.c +++ b/fs/xfs/xfs_vnodeops.c | |||
@@ -4649,6 +4649,10 @@ vnodeops_t xfs_vnodeops = { | |||
4649 | #ifdef HAVE_SENDFILE | 4649 | #ifdef HAVE_SENDFILE |
4650 | .vop_sendfile = xfs_sendfile, | 4650 | .vop_sendfile = xfs_sendfile, |
4651 | #endif | 4651 | #endif |
4652 | #ifdef HAVE_SPLICE | ||
4653 | .vop_splice_read = xfs_splice_read, | ||
4654 | .vop_splice_write = xfs_splice_write, | ||
4655 | #endif | ||
4652 | .vop_write = xfs_write, | 4656 | .vop_write = xfs_write, |
4653 | .vop_ioctl = xfs_ioctl, | 4657 | .vop_ioctl = xfs_ioctl, |
4654 | .vop_getattr = xfs_getattr, | 4658 | .vop_getattr = xfs_getattr, |