diff options
Diffstat (limited to 'fs/afs')
-rw-r--r-- | fs/afs/afs_vl.h | 2 | ||||
-rw-r--r-- | fs/afs/internal.h | 4 | ||||
-rw-r--r-- | fs/afs/security.c | 6 | ||||
-rw-r--r-- | fs/afs/write.c | 18 |
4 files changed, 20 insertions, 10 deletions
diff --git a/fs/afs/afs_vl.h b/fs/afs/afs_vl.h index 8bbefe009ed..800f607ffaf 100644 --- a/fs/afs/afs_vl.h +++ b/fs/afs/afs_vl.h | |||
@@ -49,7 +49,7 @@ enum AFSVL_Errors { | |||
49 | AFSVL_BADVOLOPER = 363542, /* Bad volume operation code */ | 49 | AFSVL_BADVOLOPER = 363542, /* Bad volume operation code */ |
50 | AFSVL_BADRELLOCKTYPE = 363543, /* Bad release lock type */ | 50 | AFSVL_BADRELLOCKTYPE = 363543, /* Bad release lock type */ |
51 | AFSVL_RERELEASE = 363544, /* Status report: last release was aborted */ | 51 | AFSVL_RERELEASE = 363544, /* Status report: last release was aborted */ |
52 | AFSVL_BADSERVERFLAG = 363545, /* Invalid replication site server °ag */ | 52 | AFSVL_BADSERVERFLAG = 363545, /* Invalid replication site server flag */ |
53 | AFSVL_PERM = 363546, /* No permission access */ | 53 | AFSVL_PERM = 363546, /* No permission access */ |
54 | AFSVL_NOMEM = 363547, /* malloc/realloc failed to alloc enough memory */ | 54 | AFSVL_NOMEM = 363547, /* malloc/realloc failed to alloc enough memory */ |
55 | }; | 55 | }; |
diff --git a/fs/afs/internal.h b/fs/afs/internal.h index 5a9b6843bac..d2b0888126d 100644 --- a/fs/afs/internal.h +++ b/fs/afs/internal.h | |||
@@ -627,7 +627,7 @@ extern void afs_clear_permits(struct afs_vnode *); | |||
627 | extern void afs_cache_permit(struct afs_vnode *, struct key *, long); | 627 | extern void afs_cache_permit(struct afs_vnode *, struct key *, long); |
628 | extern void afs_zap_permits(struct rcu_head *); | 628 | extern void afs_zap_permits(struct rcu_head *); |
629 | extern struct key *afs_request_key(struct afs_cell *); | 629 | extern struct key *afs_request_key(struct afs_cell *); |
630 | extern int afs_permission(struct inode *, int, unsigned int); | 630 | extern int afs_permission(struct inode *, int); |
631 | 631 | ||
632 | /* | 632 | /* |
633 | * server.c | 633 | * server.c |
@@ -750,7 +750,7 @@ extern void afs_pages_written_back(struct afs_vnode *, struct afs_call *); | |||
750 | extern ssize_t afs_file_write(struct kiocb *, const struct iovec *, | 750 | extern ssize_t afs_file_write(struct kiocb *, const struct iovec *, |
751 | unsigned long, loff_t); | 751 | unsigned long, loff_t); |
752 | extern int afs_writeback_all(struct afs_vnode *); | 752 | extern int afs_writeback_all(struct afs_vnode *); |
753 | extern int afs_fsync(struct file *, int); | 753 | extern int afs_fsync(struct file *, loff_t, loff_t, int); |
754 | 754 | ||
755 | 755 | ||
756 | /*****************************************************************************/ | 756 | /*****************************************************************************/ |
diff --git a/fs/afs/security.c b/fs/afs/security.c index f44b9d35537..8d010422dc8 100644 --- a/fs/afs/security.c +++ b/fs/afs/security.c | |||
@@ -285,14 +285,14 @@ static int afs_check_permit(struct afs_vnode *vnode, struct key *key, | |||
285 | * - AFS ACLs are attached to directories only, and a file is controlled by its | 285 | * - AFS ACLs are attached to directories only, and a file is controlled by its |
286 | * parent directory's ACL | 286 | * parent directory's ACL |
287 | */ | 287 | */ |
288 | int afs_permission(struct inode *inode, int mask, unsigned int flags) | 288 | int afs_permission(struct inode *inode, int mask) |
289 | { | 289 | { |
290 | struct afs_vnode *vnode = AFS_FS_I(inode); | 290 | struct afs_vnode *vnode = AFS_FS_I(inode); |
291 | afs_access_t uninitialized_var(access); | 291 | afs_access_t uninitialized_var(access); |
292 | struct key *key; | 292 | struct key *key; |
293 | int ret; | 293 | int ret; |
294 | 294 | ||
295 | if (flags & IPERM_FLAG_RCU) | 295 | if (mask & MAY_NOT_BLOCK) |
296 | return -ECHILD; | 296 | return -ECHILD; |
297 | 297 | ||
298 | _enter("{{%x:%u},%lx},%x,", | 298 | _enter("{{%x:%u},%lx},%x,", |
@@ -350,7 +350,7 @@ int afs_permission(struct inode *inode, int mask, unsigned int flags) | |||
350 | } | 350 | } |
351 | 351 | ||
352 | key_put(key); | 352 | key_put(key); |
353 | ret = generic_permission(inode, mask, flags, NULL); | 353 | ret = generic_permission(inode, mask); |
354 | _leave(" = %d", ret); | 354 | _leave(" = %d", ret); |
355 | return ret; | 355 | return ret; |
356 | 356 | ||
diff --git a/fs/afs/write.c b/fs/afs/write.c index b806285ff85..9aa52d93c73 100644 --- a/fs/afs/write.c +++ b/fs/afs/write.c | |||
@@ -681,9 +681,10 @@ int afs_writeback_all(struct afs_vnode *vnode) | |||
681 | * - the return status from this call provides a reliable indication of | 681 | * - the return status from this call provides a reliable indication of |
682 | * whether any write errors occurred for this process. | 682 | * whether any write errors occurred for this process. |
683 | */ | 683 | */ |
684 | int afs_fsync(struct file *file, int datasync) | 684 | int afs_fsync(struct file *file, loff_t start, loff_t end, int datasync) |
685 | { | 685 | { |
686 | struct dentry *dentry = file->f_path.dentry; | 686 | struct dentry *dentry = file->f_path.dentry; |
687 | struct inode *inode = file->f_mapping->host; | ||
687 | struct afs_writeback *wb, *xwb; | 688 | struct afs_writeback *wb, *xwb; |
688 | struct afs_vnode *vnode = AFS_FS_I(dentry->d_inode); | 689 | struct afs_vnode *vnode = AFS_FS_I(dentry->d_inode); |
689 | int ret; | 690 | int ret; |
@@ -692,12 +693,19 @@ int afs_fsync(struct file *file, int datasync) | |||
692 | vnode->fid.vid, vnode->fid.vnode, dentry->d_name.name, | 693 | vnode->fid.vid, vnode->fid.vnode, dentry->d_name.name, |
693 | datasync); | 694 | datasync); |
694 | 695 | ||
696 | ret = filemap_write_and_wait_range(inode->i_mapping, start, end); | ||
697 | if (ret) | ||
698 | return ret; | ||
699 | mutex_lock(&inode->i_mutex); | ||
700 | |||
695 | /* use a writeback record as a marker in the queue - when this reaches | 701 | /* use a writeback record as a marker in the queue - when this reaches |
696 | * the front of the queue, all the outstanding writes are either | 702 | * the front of the queue, all the outstanding writes are either |
697 | * completed or rejected */ | 703 | * completed or rejected */ |
698 | wb = kzalloc(sizeof(*wb), GFP_KERNEL); | 704 | wb = kzalloc(sizeof(*wb), GFP_KERNEL); |
699 | if (!wb) | 705 | if (!wb) { |
700 | return -ENOMEM; | 706 | ret = -ENOMEM; |
707 | goto out; | ||
708 | } | ||
701 | wb->vnode = vnode; | 709 | wb->vnode = vnode; |
702 | wb->first = 0; | 710 | wb->first = 0; |
703 | wb->last = -1; | 711 | wb->last = -1; |
@@ -720,7 +728,7 @@ int afs_fsync(struct file *file, int datasync) | |||
720 | if (ret < 0) { | 728 | if (ret < 0) { |
721 | afs_put_writeback(wb); | 729 | afs_put_writeback(wb); |
722 | _leave(" = %d [wb]", ret); | 730 | _leave(" = %d [wb]", ret); |
723 | return ret; | 731 | goto out; |
724 | } | 732 | } |
725 | 733 | ||
726 | /* wait for the preceding writes to actually complete */ | 734 | /* wait for the preceding writes to actually complete */ |
@@ -729,6 +737,8 @@ int afs_fsync(struct file *file, int datasync) | |||
729 | vnode->writebacks.next == &wb->link); | 737 | vnode->writebacks.next == &wb->link); |
730 | afs_put_writeback(wb); | 738 | afs_put_writeback(wb); |
731 | _leave(" = %d", ret); | 739 | _leave(" = %d", ret); |
740 | out: | ||
741 | mutex_unlock(&inode->i_mutex); | ||
732 | return ret; | 742 | return ret; |
733 | } | 743 | } |
734 | 744 | ||