diff options
| author | Steve French <sfrench@us.ibm.com> | 2005-12-31 13:27:22 -0500 |
|---|---|---|
| committer | Steve French <sfrench@us.ibm.com> | 2005-12-31 13:27:22 -0500 |
| commit | eea60caef610c7a6c58c0de9c80ae1e438e01301 (patch) | |
| tree | 25e19289bba003fe085e589430d0d981fd6b73a7 /fs | |
| parent | da8543ef125afc7bba4da526b61a1ae07dc25109 (diff) | |
| parent | 82c9df820112c6286a8e8fbe482e94b65b49062c (diff) | |
Merge with /pub/scm/linux/kernel/git/torvalds/linux-2.6.git
Signed-off-by: Steve French <sfrench@us.ibm.com>
Diffstat (limited to 'fs')
| -rw-r--r-- | fs/hostfs/hostfs_kern.c | 9 | ||||
| -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/xfs/quota/xfs_qm.c | 4 |
13 files changed, 111 insertions, 89 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/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/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 | ||
