diff options
Diffstat (limited to 'fs')
-rw-r--r-- | fs/hostfs/hostfs_kern.c | 9 | ||||
-rw-r--r-- | fs/inotify.c | 13 | ||||
-rw-r--r-- | fs/lockd/clntlock.c | 4 | ||||
-rw-r--r-- | fs/nfs/direct.c | 24 | ||||
-rw-r--r-- | fs/nfs/file.c | 26 | ||||
-rw-r--r-- | fs/nfs/inode.c | 28 | ||||
-rw-r--r-- | fs/nfsd/nfs2acl.c | 2 | ||||
-rw-r--r-- | fs/nfsd/nfs3acl.c | 2 | ||||
-rw-r--r-- | fs/partitions/Kconfig | 2 | ||||
-rw-r--r-- | fs/proc/generic.c | 47 | ||||
-rw-r--r-- | fs/reiserfs/inode.c | 26 | ||||
-rw-r--r-- | fs/reiserfs/journal.c | 18 | ||||
-rw-r--r-- | fs/relayfs/relay.c | 8 | ||||
-rw-r--r-- | fs/xattr.c | 2 | ||||
-rw-r--r-- | fs/xfs/quota/xfs_qm.c | 4 |
15 files changed, 122 insertions, 93 deletions
diff --git a/fs/hostfs/hostfs_kern.c b/fs/hostfs/hostfs_kern.c index 4684eb7d48c6..b3ad0bd0312f 100644 --- a/fs/hostfs/hostfs_kern.c +++ b/fs/hostfs/hostfs_kern.c | |||
@@ -501,11 +501,16 @@ int hostfs_commit_write(struct file *file, struct page *page, unsigned from, | |||
501 | long long start; | 501 | long long start; |
502 | int err = 0; | 502 | int err = 0; |
503 | 503 | ||
504 | start = (long long) (page->index << PAGE_CACHE_SHIFT) + from; | 504 | start = (((long long) page->index) << PAGE_CACHE_SHIFT) + from; |
505 | buffer = kmap(page); | 505 | buffer = kmap(page); |
506 | err = write_file(FILE_HOSTFS_I(file)->fd, &start, buffer + from, | 506 | err = write_file(FILE_HOSTFS_I(file)->fd, &start, buffer + from, |
507 | to - from); | 507 | to - from); |
508 | if(err > 0) err = 0; | 508 | if(err > 0) err = 0; |
509 | |||
510 | /* Actually, if !err, write_file has added to-from to start, so, despite | ||
511 | * the appearance, we are comparing i_size against the _last_ written | ||
512 | * location, as we should. */ | ||
513 | |||
509 | if(!err && (start > inode->i_size)) | 514 | if(!err && (start > inode->i_size)) |
510 | inode->i_size = start; | 515 | inode->i_size = start; |
511 | 516 | ||
@@ -910,10 +915,8 @@ static struct inode_operations hostfs_dir_iops = { | |||
910 | int hostfs_link_readpage(struct file *file, struct page *page) | 915 | int hostfs_link_readpage(struct file *file, struct page *page) |
911 | { | 916 | { |
912 | char *buffer, *name; | 917 | char *buffer, *name; |
913 | long long start; | ||
914 | int err; | 918 | int err; |
915 | 919 | ||
916 | start = page->index << PAGE_CACHE_SHIFT; | ||
917 | buffer = kmap(page); | 920 | buffer = kmap(page); |
918 | name = inode_name(page->mapping->host, 0); | 921 | name = inode_name(page->mapping->host, 0); |
919 | if(name == NULL) return(-ENOMEM); | 922 | if(name == NULL) return(-ENOMEM); |
diff --git a/fs/inotify.c b/fs/inotify.c index bf7ce1d2412b..2fecb7af4a77 100644 --- a/fs/inotify.c +++ b/fs/inotify.c | |||
@@ -364,11 +364,12 @@ static int inotify_dev_get_wd(struct inotify_device *dev, | |||
364 | /* | 364 | /* |
365 | * find_inode - resolve a user-given path to a specific inode and return a nd | 365 | * find_inode - resolve a user-given path to a specific inode and return a nd |
366 | */ | 366 | */ |
367 | static int find_inode(const char __user *dirname, struct nameidata *nd) | 367 | static int find_inode(const char __user *dirname, struct nameidata *nd, |
368 | unsigned flags) | ||
368 | { | 369 | { |
369 | int error; | 370 | int error; |
370 | 371 | ||
371 | error = __user_walk(dirname, LOOKUP_FOLLOW, nd); | 372 | error = __user_walk(dirname, flags, nd); |
372 | if (error) | 373 | if (error) |
373 | return error; | 374 | return error; |
374 | /* you can only watch an inode if you have read permissions on it */ | 375 | /* you can only watch an inode if you have read permissions on it */ |
@@ -933,6 +934,7 @@ asmlinkage long sys_inotify_add_watch(int fd, const char __user *path, u32 mask) | |||
933 | struct file *filp; | 934 | struct file *filp; |
934 | int ret, fput_needed; | 935 | int ret, fput_needed; |
935 | int mask_add = 0; | 936 | int mask_add = 0; |
937 | unsigned flags = 0; | ||
936 | 938 | ||
937 | filp = fget_light(fd, &fput_needed); | 939 | filp = fget_light(fd, &fput_needed); |
938 | if (unlikely(!filp)) | 940 | if (unlikely(!filp)) |
@@ -944,7 +946,12 @@ asmlinkage long sys_inotify_add_watch(int fd, const char __user *path, u32 mask) | |||
944 | goto fput_and_out; | 946 | goto fput_and_out; |
945 | } | 947 | } |
946 | 948 | ||
947 | ret = find_inode(path, &nd); | 949 | if (!(mask & IN_DONT_FOLLOW)) |
950 | flags |= LOOKUP_FOLLOW; | ||
951 | if (mask & IN_ONLYDIR) | ||
952 | flags |= LOOKUP_DIRECTORY; | ||
953 | |||
954 | ret = find_inode(path, &nd, flags); | ||
948 | if (unlikely(ret)) | 955 | if (unlikely(ret)) |
949 | goto fput_and_out; | 956 | goto fput_and_out; |
950 | 957 | ||
diff --git a/fs/lockd/clntlock.c b/fs/lockd/clntlock.c index 006bb9e14579..3eaf6e701087 100644 --- a/fs/lockd/clntlock.c +++ b/fs/lockd/clntlock.c | |||
@@ -157,6 +157,8 @@ void nlmclnt_mark_reclaim(struct nlm_host *host) | |||
157 | inode = fl->fl_file->f_dentry->d_inode; | 157 | inode = fl->fl_file->f_dentry->d_inode; |
158 | if (inode->i_sb->s_magic != NFS_SUPER_MAGIC) | 158 | if (inode->i_sb->s_magic != NFS_SUPER_MAGIC) |
159 | continue; | 159 | continue; |
160 | if (fl->fl_u.nfs_fl.owner == NULL) | ||
161 | continue; | ||
160 | if (fl->fl_u.nfs_fl.owner->host != host) | 162 | if (fl->fl_u.nfs_fl.owner->host != host) |
161 | continue; | 163 | continue; |
162 | if (!(fl->fl_u.nfs_fl.flags & NFS_LCK_GRANTED)) | 164 | if (!(fl->fl_u.nfs_fl.flags & NFS_LCK_GRANTED)) |
@@ -226,6 +228,8 @@ restart: | |||
226 | inode = fl->fl_file->f_dentry->d_inode; | 228 | inode = fl->fl_file->f_dentry->d_inode; |
227 | if (inode->i_sb->s_magic != NFS_SUPER_MAGIC) | 229 | if (inode->i_sb->s_magic != NFS_SUPER_MAGIC) |
228 | continue; | 230 | continue; |
231 | if (fl->fl_u.nfs_fl.owner == NULL) | ||
232 | continue; | ||
229 | if (fl->fl_u.nfs_fl.owner->host != host) | 233 | if (fl->fl_u.nfs_fl.owner->host != host) |
230 | continue; | 234 | continue; |
231 | if (!(fl->fl_u.nfs_fl.flags & NFS_LCK_RECLAIM)) | 235 | if (!(fl->fl_u.nfs_fl.flags & NFS_LCK_RECLAIM)) |
diff --git a/fs/nfs/direct.c b/fs/nfs/direct.c index b497c71384e8..079228817603 100644 --- a/fs/nfs/direct.c +++ b/fs/nfs/direct.c | |||
@@ -678,15 +678,9 @@ nfs_file_direct_read(struct kiocb *iocb, char __user *buf, size_t count, loff_t | |||
678 | if (!count) | 678 | if (!count) |
679 | goto out; | 679 | goto out; |
680 | 680 | ||
681 | if (mapping->nrpages) { | 681 | retval = nfs_sync_mapping(mapping); |
682 | retval = filemap_fdatawrite(mapping); | 682 | if (retval) |
683 | if (retval == 0) | 683 | goto out; |
684 | retval = nfs_wb_all(inode); | ||
685 | if (retval == 0) | ||
686 | retval = filemap_fdatawait(mapping); | ||
687 | if (retval) | ||
688 | goto out; | ||
689 | } | ||
690 | 684 | ||
691 | retval = nfs_direct_read(inode, ctx, &iov, pos, 1); | 685 | retval = nfs_direct_read(inode, ctx, &iov, pos, 1); |
692 | if (retval > 0) | 686 | if (retval > 0) |
@@ -764,15 +758,9 @@ nfs_file_direct_write(struct kiocb *iocb, const char __user *buf, size_t count, | |||
764 | if (!count) | 758 | if (!count) |
765 | goto out; | 759 | goto out; |
766 | 760 | ||
767 | if (mapping->nrpages) { | 761 | retval = nfs_sync_mapping(mapping); |
768 | retval = filemap_fdatawrite(mapping); | 762 | if (retval) |
769 | if (retval == 0) | 763 | goto out; |
770 | retval = nfs_wb_all(inode); | ||
771 | if (retval == 0) | ||
772 | retval = filemap_fdatawait(mapping); | ||
773 | if (retval) | ||
774 | goto out; | ||
775 | } | ||
776 | 764 | ||
777 | retval = nfs_direct_write(inode, ctx, &iov, pos, 1); | 765 | retval = nfs_direct_write(inode, ctx, &iov, pos, 1); |
778 | if (mapping->nrpages) | 766 | if (mapping->nrpages) |
diff --git a/fs/nfs/file.c b/fs/nfs/file.c index 57d3e77d97ee..7a79fbe9f539 100644 --- a/fs/nfs/file.c +++ b/fs/nfs/file.c | |||
@@ -433,11 +433,7 @@ static int do_unlk(struct file *filp, int cmd, struct file_lock *fl) | |||
433 | * Flush all pending writes before doing anything | 433 | * Flush all pending writes before doing anything |
434 | * with locks.. | 434 | * with locks.. |
435 | */ | 435 | */ |
436 | filemap_fdatawrite(filp->f_mapping); | 436 | nfs_sync_mapping(filp->f_mapping); |
437 | down(&inode->i_sem); | ||
438 | nfs_wb_all(inode); | ||
439 | up(&inode->i_sem); | ||
440 | filemap_fdatawait(filp->f_mapping); | ||
441 | 437 | ||
442 | /* NOTE: special case | 438 | /* NOTE: special case |
443 | * If we're signalled while cleaning up locks on process exit, we | 439 | * If we're signalled while cleaning up locks on process exit, we |
@@ -465,15 +461,8 @@ static int do_setlk(struct file *filp, int cmd, struct file_lock *fl) | |||
465 | * Flush all pending writes before doing anything | 461 | * Flush all pending writes before doing anything |
466 | * with locks.. | 462 | * with locks.. |
467 | */ | 463 | */ |
468 | status = filemap_fdatawrite(filp->f_mapping); | 464 | status = nfs_sync_mapping(filp->f_mapping); |
469 | if (status == 0) { | 465 | if (status != 0) |
470 | down(&inode->i_sem); | ||
471 | status = nfs_wb_all(inode); | ||
472 | up(&inode->i_sem); | ||
473 | if (status == 0) | ||
474 | status = filemap_fdatawait(filp->f_mapping); | ||
475 | } | ||
476 | if (status < 0) | ||
477 | goto out; | 466 | goto out; |
478 | 467 | ||
479 | lock_kernel(); | 468 | lock_kernel(); |
@@ -497,11 +486,7 @@ static int do_setlk(struct file *filp, int cmd, struct file_lock *fl) | |||
497 | * Make sure we clear the cache whenever we try to get the lock. | 486 | * Make sure we clear the cache whenever we try to get the lock. |
498 | * This makes locking act as a cache coherency point. | 487 | * This makes locking act as a cache coherency point. |
499 | */ | 488 | */ |
500 | filemap_fdatawrite(filp->f_mapping); | 489 | nfs_sync_mapping(filp->f_mapping); |
501 | down(&inode->i_sem); | ||
502 | nfs_wb_all(inode); /* we may have slept */ | ||
503 | up(&inode->i_sem); | ||
504 | filemap_fdatawait(filp->f_mapping); | ||
505 | nfs_zap_caches(inode); | 490 | nfs_zap_caches(inode); |
506 | out: | 491 | out: |
507 | rpc_clnt_sigunmask(NFS_CLIENT(inode), &oldset); | 492 | rpc_clnt_sigunmask(NFS_CLIENT(inode), &oldset); |
@@ -524,7 +509,8 @@ static int nfs_lock(struct file *filp, int cmd, struct file_lock *fl) | |||
524 | return -EINVAL; | 509 | return -EINVAL; |
525 | 510 | ||
526 | /* No mandatory locks over NFS */ | 511 | /* No mandatory locks over NFS */ |
527 | if ((inode->i_mode & (S_ISGID | S_IXGRP)) == S_ISGID) | 512 | if ((inode->i_mode & (S_ISGID | S_IXGRP)) == S_ISGID && |
513 | fl->fl_type != F_UNLCK) | ||
528 | return -ENOLCK; | 514 | return -ENOLCK; |
529 | 515 | ||
530 | if (IS_GETLK(cmd)) | 516 | if (IS_GETLK(cmd)) |
diff --git a/fs/nfs/inode.c b/fs/nfs/inode.c index afd75d0463fd..432f41cd75e6 100644 --- a/fs/nfs/inode.c +++ b/fs/nfs/inode.c | |||
@@ -640,6 +640,27 @@ static int nfs_show_options(struct seq_file *m, struct vfsmount *mnt) | |||
640 | return 0; | 640 | return 0; |
641 | } | 641 | } |
642 | 642 | ||
643 | /** | ||
644 | * nfs_sync_mapping - helper to flush all mmapped dirty data to disk | ||
645 | */ | ||
646 | int nfs_sync_mapping(struct address_space *mapping) | ||
647 | { | ||
648 | int ret; | ||
649 | |||
650 | if (mapping->nrpages == 0) | ||
651 | return 0; | ||
652 | unmap_mapping_range(mapping, 0, 0, 0); | ||
653 | ret = filemap_fdatawrite(mapping); | ||
654 | if (ret != 0) | ||
655 | goto out; | ||
656 | ret = filemap_fdatawait(mapping); | ||
657 | if (ret != 0) | ||
658 | goto out; | ||
659 | ret = nfs_wb_all(mapping->host); | ||
660 | out: | ||
661 | return ret; | ||
662 | } | ||
663 | |||
643 | /* | 664 | /* |
644 | * Invalidate the local caches | 665 | * Invalidate the local caches |
645 | */ | 666 | */ |
@@ -1179,11 +1200,8 @@ void nfs_revalidate_mapping(struct inode *inode, struct address_space *mapping) | |||
1179 | struct nfs_inode *nfsi = NFS_I(inode); | 1200 | struct nfs_inode *nfsi = NFS_I(inode); |
1180 | 1201 | ||
1181 | if (nfsi->cache_validity & NFS_INO_INVALID_DATA) { | 1202 | if (nfsi->cache_validity & NFS_INO_INVALID_DATA) { |
1182 | if (S_ISREG(inode->i_mode)) { | 1203 | if (S_ISREG(inode->i_mode)) |
1183 | if (filemap_fdatawrite(mapping) == 0) | 1204 | nfs_sync_mapping(mapping); |
1184 | filemap_fdatawait(mapping); | ||
1185 | nfs_wb_all(inode); | ||
1186 | } | ||
1187 | invalidate_inode_pages2(mapping); | 1205 | invalidate_inode_pages2(mapping); |
1188 | 1206 | ||
1189 | spin_lock(&inode->i_lock); | 1207 | spin_lock(&inode->i_lock); |
diff --git a/fs/nfsd/nfs2acl.c b/fs/nfsd/nfs2acl.c index 7cbf0682b2f0..fc95c4df6693 100644 --- a/fs/nfsd/nfs2acl.c +++ b/fs/nfsd/nfs2acl.c | |||
@@ -107,7 +107,7 @@ static int nfsacld_proc_setacl(struct svc_rqst * rqstp, | |||
107 | dprintk("nfsd: SETACL(2acl) %s\n", SVCFH_fmt(&argp->fh)); | 107 | dprintk("nfsd: SETACL(2acl) %s\n", SVCFH_fmt(&argp->fh)); |
108 | 108 | ||
109 | fh = fh_copy(&resp->fh, &argp->fh); | 109 | fh = fh_copy(&resp->fh, &argp->fh); |
110 | nfserr = fh_verify(rqstp, &resp->fh, 0, MAY_NOP); | 110 | nfserr = fh_verify(rqstp, &resp->fh, 0, MAY_SATTR); |
111 | 111 | ||
112 | if (!nfserr) { | 112 | if (!nfserr) { |
113 | nfserr = nfserrno( nfsd_set_posix_acl( | 113 | nfserr = nfserrno( nfsd_set_posix_acl( |
diff --git a/fs/nfsd/nfs3acl.c b/fs/nfsd/nfs3acl.c index 64ba40572fea..16e10c170aed 100644 --- a/fs/nfsd/nfs3acl.c +++ b/fs/nfsd/nfs3acl.c | |||
@@ -101,7 +101,7 @@ static int nfsd3_proc_setacl(struct svc_rqst * rqstp, | |||
101 | int nfserr = 0; | 101 | int nfserr = 0; |
102 | 102 | ||
103 | fh = fh_copy(&resp->fh, &argp->fh); | 103 | fh = fh_copy(&resp->fh, &argp->fh); |
104 | nfserr = fh_verify(rqstp, &resp->fh, 0, MAY_NOP); | 104 | nfserr = fh_verify(rqstp, &resp->fh, 0, MAY_SATTR); |
105 | 105 | ||
106 | if (!nfserr) { | 106 | if (!nfserr) { |
107 | nfserr = nfserrno( nfsd_set_posix_acl( | 107 | nfserr = nfserrno( nfsd_set_posix_acl( |
diff --git a/fs/partitions/Kconfig b/fs/partitions/Kconfig index deb25b661f04..656bc43431b9 100644 --- a/fs/partitions/Kconfig +++ b/fs/partitions/Kconfig | |||
@@ -203,7 +203,7 @@ config ULTRIX_PARTITION | |||
203 | 203 | ||
204 | config SUN_PARTITION | 204 | config SUN_PARTITION |
205 | bool "Sun partition tables support" if PARTITION_ADVANCED | 205 | bool "Sun partition tables support" if PARTITION_ADVANCED |
206 | default y if (SPARC32 || SPARC64 || SUN3 || SUN3X) | 206 | default y if (SPARC || SUN3 || SUN3X) |
207 | ---help--- | 207 | ---help--- |
208 | Like most systems, SunOS uses its own hard disk partition table | 208 | Like most systems, SunOS uses its own hard disk partition table |
209 | format, incompatible with all others. Saying Y here allows you to | 209 | format, incompatible with all others. Saying Y here allows you to |
diff --git a/fs/proc/generic.c b/fs/proc/generic.c index b638fb500743..72b431d0a0a4 100644 --- a/fs/proc/generic.c +++ b/fs/proc/generic.c | |||
@@ -54,6 +54,18 @@ proc_file_read(struct file *file, char __user *buf, size_t nbytes, | |||
54 | ssize_t n, count; | 54 | ssize_t n, count; |
55 | char *start; | 55 | char *start; |
56 | struct proc_dir_entry * dp; | 56 | struct proc_dir_entry * dp; |
57 | unsigned long long pos; | ||
58 | |||
59 | /* | ||
60 | * Gaah, please just use "seq_file" instead. The legacy /proc | ||
61 | * interfaces cut loff_t down to off_t for reads, and ignore | ||
62 | * the offset entirely for writes.. | ||
63 | */ | ||
64 | pos = *ppos; | ||
65 | if (pos > MAX_NON_LFS) | ||
66 | return 0; | ||
67 | if (nbytes > MAX_NON_LFS - pos) | ||
68 | nbytes = MAX_NON_LFS - pos; | ||
57 | 69 | ||
58 | dp = PDE(inode); | 70 | dp = PDE(inode); |
59 | if (!(page = (char*) __get_free_page(GFP_KERNEL))) | 71 | if (!(page = (char*) __get_free_page(GFP_KERNEL))) |
@@ -202,30 +214,17 @@ proc_file_write(struct file *file, const char __user *buffer, | |||
202 | static loff_t | 214 | static loff_t |
203 | proc_file_lseek(struct file *file, loff_t offset, int orig) | 215 | proc_file_lseek(struct file *file, loff_t offset, int orig) |
204 | { | 216 | { |
205 | lock_kernel(); | 217 | loff_t retval = -EINVAL; |
206 | 218 | switch (orig) { | |
207 | switch (orig) { | 219 | case 1: |
208 | case 0: | 220 | offset += file->f_pos; |
209 | if (offset < 0) | 221 | /* fallthrough */ |
210 | goto out; | 222 | case 0: |
211 | file->f_pos = offset; | 223 | if (offset < 0 || offset > MAX_NON_LFS) |
212 | unlock_kernel(); | 224 | break; |
213 | return(file->f_pos); | 225 | file->f_pos = retval = offset; |
214 | case 1: | 226 | } |
215 | if (offset + file->f_pos < 0) | 227 | return retval; |
216 | goto out; | ||
217 | file->f_pos += offset; | ||
218 | unlock_kernel(); | ||
219 | return(file->f_pos); | ||
220 | case 2: | ||
221 | goto out; | ||
222 | default: | ||
223 | goto out; | ||
224 | } | ||
225 | |||
226 | out: | ||
227 | unlock_kernel(); | ||
228 | return -EINVAL; | ||
229 | } | 228 | } |
230 | 229 | ||
231 | static int proc_notify_change(struct dentry *dentry, struct iattr *iattr) | 230 | static int proc_notify_change(struct dentry *dentry, struct iattr *iattr) |
diff --git a/fs/reiserfs/inode.c b/fs/reiserfs/inode.c index 0a044ad98885..a5e3a0ddbe53 100644 --- a/fs/reiserfs/inode.c +++ b/fs/reiserfs/inode.c | |||
@@ -32,6 +32,7 @@ void reiserfs_delete_inode(struct inode *inode) | |||
32 | JOURNAL_PER_BALANCE_CNT * 2 + | 32 | JOURNAL_PER_BALANCE_CNT * 2 + |
33 | 2 * REISERFS_QUOTA_INIT_BLOCKS(inode->i_sb); | 33 | 2 * REISERFS_QUOTA_INIT_BLOCKS(inode->i_sb); |
34 | struct reiserfs_transaction_handle th; | 34 | struct reiserfs_transaction_handle th; |
35 | int err; | ||
35 | 36 | ||
36 | truncate_inode_pages(&inode->i_data, 0); | 37 | truncate_inode_pages(&inode->i_data, 0); |
37 | 38 | ||
@@ -49,15 +50,13 @@ void reiserfs_delete_inode(struct inode *inode) | |||
49 | } | 50 | } |
50 | reiserfs_update_inode_transaction(inode); | 51 | reiserfs_update_inode_transaction(inode); |
51 | 52 | ||
52 | if (reiserfs_delete_object(&th, inode)) { | 53 | err = reiserfs_delete_object(&th, inode); |
53 | up(&inode->i_sem); | ||
54 | goto out; | ||
55 | } | ||
56 | 54 | ||
57 | /* Do quota update inside a transaction for journaled quotas. We must do that | 55 | /* Do quota update inside a transaction for journaled quotas. We must do that |
58 | * after delete_object so that quota updates go into the same transaction as | 56 | * after delete_object so that quota updates go into the same transaction as |
59 | * stat data deletion */ | 57 | * stat data deletion */ |
60 | DQUOT_FREE_INODE(inode); | 58 | if (!err) |
59 | DQUOT_FREE_INODE(inode); | ||
61 | 60 | ||
62 | if (journal_end(&th, inode->i_sb, jbegin_count)) { | 61 | if (journal_end(&th, inode->i_sb, jbegin_count)) { |
63 | up(&inode->i_sem); | 62 | up(&inode->i_sem); |
@@ -66,6 +65,12 @@ void reiserfs_delete_inode(struct inode *inode) | |||
66 | 65 | ||
67 | up(&inode->i_sem); | 66 | up(&inode->i_sem); |
68 | 67 | ||
68 | /* check return value from reiserfs_delete_object after | ||
69 | * ending the transaction | ||
70 | */ | ||
71 | if (err) | ||
72 | goto out; | ||
73 | |||
69 | /* all items of file are deleted, so we can remove "save" link */ | 74 | /* all items of file are deleted, so we can remove "save" link */ |
70 | remove_save_link(inode, 0 /* not truncate */ ); /* we can't do anything | 75 | remove_save_link(inode, 0 /* not truncate */ ); /* we can't do anything |
71 | * about an error here */ | 76 | * about an error here */ |
@@ -2099,6 +2104,7 @@ int reiserfs_truncate_file(struct inode *p_s_inode, int update_timestamps) | |||
2099 | struct page *page = NULL; | 2104 | struct page *page = NULL; |
2100 | int error; | 2105 | int error; |
2101 | struct buffer_head *bh = NULL; | 2106 | struct buffer_head *bh = NULL; |
2107 | int err2; | ||
2102 | 2108 | ||
2103 | reiserfs_write_lock(p_s_inode->i_sb); | 2109 | reiserfs_write_lock(p_s_inode->i_sb); |
2104 | 2110 | ||
@@ -2136,14 +2142,18 @@ int reiserfs_truncate_file(struct inode *p_s_inode, int update_timestamps) | |||
2136 | transaction of truncating gets committed - on reboot the file | 2142 | transaction of truncating gets committed - on reboot the file |
2137 | either appears truncated properly or not truncated at all */ | 2143 | either appears truncated properly or not truncated at all */ |
2138 | add_save_link(&th, p_s_inode, 1); | 2144 | add_save_link(&th, p_s_inode, 1); |
2139 | error = reiserfs_do_truncate(&th, p_s_inode, page, update_timestamps); | 2145 | err2 = reiserfs_do_truncate(&th, p_s_inode, page, update_timestamps); |
2140 | if (error) | ||
2141 | goto out; | ||
2142 | error = | 2146 | error = |
2143 | journal_end(&th, p_s_inode->i_sb, JOURNAL_PER_BALANCE_CNT * 2 + 1); | 2147 | journal_end(&th, p_s_inode->i_sb, JOURNAL_PER_BALANCE_CNT * 2 + 1); |
2144 | if (error) | 2148 | if (error) |
2145 | goto out; | 2149 | goto out; |
2146 | 2150 | ||
2151 | /* check reiserfs_do_truncate after ending the transaction */ | ||
2152 | if (err2) { | ||
2153 | error = err2; | ||
2154 | goto out; | ||
2155 | } | ||
2156 | |||
2147 | if (update_timestamps) { | 2157 | if (update_timestamps) { |
2148 | error = remove_save_link(p_s_inode, 1 /* truncate */ ); | 2158 | error = remove_save_link(p_s_inode, 1 /* truncate */ ); |
2149 | if (error) | 2159 | if (error) |
diff --git a/fs/reiserfs/journal.c b/fs/reiserfs/journal.c index 68b7b78638ff..3f17ef844fb6 100644 --- a/fs/reiserfs/journal.c +++ b/fs/reiserfs/journal.c | |||
@@ -1039,6 +1039,10 @@ static int flush_commit_list(struct super_block *s, | |||
1039 | } | 1039 | } |
1040 | atomic_dec(&journal->j_async_throttle); | 1040 | atomic_dec(&journal->j_async_throttle); |
1041 | 1041 | ||
1042 | /* We're skipping the commit if there's an error */ | ||
1043 | if (retval || reiserfs_is_journal_aborted(journal)) | ||
1044 | barrier = 0; | ||
1045 | |||
1042 | /* wait on everything written so far before writing the commit | 1046 | /* wait on everything written so far before writing the commit |
1043 | * if we are in barrier mode, send the commit down now | 1047 | * if we are in barrier mode, send the commit down now |
1044 | */ | 1048 | */ |
@@ -1077,10 +1081,16 @@ static int flush_commit_list(struct super_block *s, | |||
1077 | BUG_ON(atomic_read(&(jl->j_commit_left)) != 1); | 1081 | BUG_ON(atomic_read(&(jl->j_commit_left)) != 1); |
1078 | 1082 | ||
1079 | if (!barrier) { | 1083 | if (!barrier) { |
1080 | if (buffer_dirty(jl->j_commit_bh)) | 1084 | /* If there was a write error in the journal - we can't commit |
1081 | BUG(); | 1085 | * this transaction - it will be invalid and, if successful, |
1082 | mark_buffer_dirty(jl->j_commit_bh); | 1086 | * will just end up propogating the write error out to |
1083 | sync_dirty_buffer(jl->j_commit_bh); | 1087 | * the file system. */ |
1088 | if (likely(!retval && !reiserfs_is_journal_aborted (journal))) { | ||
1089 | if (buffer_dirty(jl->j_commit_bh)) | ||
1090 | BUG(); | ||
1091 | mark_buffer_dirty(jl->j_commit_bh) ; | ||
1092 | sync_dirty_buffer(jl->j_commit_bh) ; | ||
1093 | } | ||
1084 | } else | 1094 | } else |
1085 | wait_on_buffer(jl->j_commit_bh); | 1095 | wait_on_buffer(jl->j_commit_bh); |
1086 | 1096 | ||
diff --git a/fs/relayfs/relay.c b/fs/relayfs/relay.c index 16446a15c96d..2a6f7f12b7f9 100644 --- a/fs/relayfs/relay.c +++ b/fs/relayfs/relay.c | |||
@@ -333,8 +333,7 @@ size_t relay_switch_subbuf(struct rchan_buf *buf, size_t length) | |||
333 | return length; | 333 | return length; |
334 | 334 | ||
335 | toobig: | 335 | toobig: |
336 | printk(KERN_WARNING "relayfs: event too large (%Zd)\n", length); | 336 | buf->chan->last_toobig = length; |
337 | WARN_ON(1); | ||
338 | return 0; | 337 | return 0; |
339 | } | 338 | } |
340 | 339 | ||
@@ -399,6 +398,11 @@ void relay_close(struct rchan *chan) | |||
399 | relay_close_buf(chan->buf[i]); | 398 | relay_close_buf(chan->buf[i]); |
400 | } | 399 | } |
401 | 400 | ||
401 | if (chan->last_toobig) | ||
402 | printk(KERN_WARNING "relayfs: one or more items not logged " | ||
403 | "[item size (%Zd) > sub-buffer size (%Zd)]\n", | ||
404 | chan->last_toobig, chan->subbuf_size); | ||
405 | |||
402 | kref_put(&chan->kref, relay_destroy_channel); | 406 | kref_put(&chan->kref, relay_destroy_channel); |
403 | } | 407 | } |
404 | 408 | ||
diff --git a/fs/xattr.c b/fs/xattr.c index a9db22557998..bcc2156d4d28 100644 --- a/fs/xattr.c +++ b/fs/xattr.c | |||
@@ -245,7 +245,7 @@ listxattr(struct dentry *d, char __user *list, size_t size) | |||
245 | error = d->d_inode->i_op->listxattr(d, klist, size); | 245 | error = d->d_inode->i_op->listxattr(d, klist, size); |
246 | } else { | 246 | } else { |
247 | error = security_inode_listsecurity(d->d_inode, klist, size); | 247 | error = security_inode_listsecurity(d->d_inode, klist, size); |
248 | if (size && error >= size) | 248 | if (size && error > size) |
249 | error = -ERANGE; | 249 | error = -ERANGE; |
250 | } | 250 | } |
251 | if (error > 0) { | 251 | if (error > 0) { |
diff --git a/fs/xfs/quota/xfs_qm.c b/fs/xfs/quota/xfs_qm.c index 1aea42d71a64..5328a2937127 100644 --- a/fs/xfs/quota/xfs_qm.c +++ b/fs/xfs/quota/xfs_qm.c | |||
@@ -78,7 +78,7 @@ STATIC int xfs_qm_dqhashlock_nowait(xfs_dquot_t *); | |||
78 | 78 | ||
79 | STATIC int xfs_qm_init_quotainos(xfs_mount_t *); | 79 | STATIC int xfs_qm_init_quotainos(xfs_mount_t *); |
80 | STATIC int xfs_qm_init_quotainfo(xfs_mount_t *); | 80 | STATIC int xfs_qm_init_quotainfo(xfs_mount_t *); |
81 | STATIC int xfs_qm_shake(int, unsigned int); | 81 | STATIC int xfs_qm_shake(int, gfp_t); |
82 | 82 | ||
83 | #ifdef DEBUG | 83 | #ifdef DEBUG |
84 | extern mutex_t qcheck_lock; | 84 | extern mutex_t qcheck_lock; |
@@ -2197,7 +2197,7 @@ xfs_qm_shake_freelist( | |||
2197 | */ | 2197 | */ |
2198 | /* ARGSUSED */ | 2198 | /* ARGSUSED */ |
2199 | STATIC int | 2199 | STATIC int |
2200 | xfs_qm_shake(int nr_to_scan, unsigned int gfp_mask) | 2200 | xfs_qm_shake(int nr_to_scan, gfp_t gfp_mask) |
2201 | { | 2201 | { |
2202 | int ndqused, nfree, n; | 2202 | int ndqused, nfree, n; |
2203 | 2203 | ||