@@ -89,8 +89,7 @@ struct afs_call {
8989 struct afs_server * cm_server ; /* Server affected by incoming CM call */
9090 struct afs_cb_interest * cbi ; /* Callback interest for server used */
9191 void * request ; /* request data (first part) */
92- struct address_space * mapping ; /* page set */
93- struct afs_writeback * wb ; /* writeback being performed */
92+ struct address_space * mapping ; /* Pages being written from */
9493 void * buffer ; /* reply receive buffer */
9594 void * reply [4 ]; /* Where to put the reply */
9695 pgoff_t first ; /* first page in mapping to deal with */
@@ -138,11 +137,21 @@ struct afs_call_type {
138137 void (* work )(struct work_struct * work );
139138};
140139
140+ /*
141+ * Key available for writeback on a file.
142+ */
143+ struct afs_wb_key {
144+ refcount_t usage ;
145+ struct key * key ;
146+ struct list_head vnode_link ; /* Link in vnode->wb_keys */
147+ };
148+
141149/*
142150 * AFS open file information record. Pointed to by file->private_data.
143151 */
144152struct afs_file {
145153 struct key * key ; /* The key this file was opened with */
154+ struct afs_wb_key * wb ; /* Writeback key record for this file */
146155};
147156
148157static inline struct key * afs_file_key (struct file * file )
@@ -167,32 +176,6 @@ struct afs_read {
167176 struct page * pages [];
168177};
169178
170- /*
171- * record of an outstanding writeback on a vnode
172- */
173- struct afs_writeback {
174- struct list_head link ; /* link in vnode->writebacks */
175- struct work_struct writer ; /* work item to perform the writeback */
176- struct afs_vnode * vnode ; /* vnode to which this write applies */
177- struct key * key ; /* owner of this write */
178- wait_queue_head_t waitq ; /* completion and ready wait queue */
179- pgoff_t first ; /* first page in batch */
180- pgoff_t point ; /* last page in current store op */
181- pgoff_t last ; /* last page in batch (inclusive) */
182- unsigned offset_first ; /* offset into first page of start of write */
183- unsigned to_last ; /* offset into last page of end of write */
184- int num_conflicts ; /* count of conflicting writes in list */
185- int usage ;
186- bool conflicts ; /* T if has dependent conflicts */
187- enum {
188- AFS_WBACK_SYNCING , /* synchronisation being performed */
189- AFS_WBACK_PENDING , /* write pending */
190- AFS_WBACK_CONFLICTING , /* conflicting writes posted */
191- AFS_WBACK_WRITING , /* writing back */
192- AFS_WBACK_COMPLETE /* the writeback record has been unlinked */
193- } state __attribute__((packed ));
194- };
195-
196179/*
197180 * AFS superblock private data
198181 * - there's one superblock per volume
@@ -460,7 +443,7 @@ struct afs_vnode {
460443 struct afs_permits * permit_cache ; /* cache of permits so far obtained */
461444 struct mutex io_lock ; /* Lock for serialising I/O on this mutex */
462445 struct mutex validate_lock ; /* lock for validating this vnode */
463- spinlock_t writeback_lock ; /* lock for writebacks */
446+ spinlock_t wb_lock ; /* lock for wb_keys */
464447 spinlock_t lock ; /* waitqueue/flags lock */
465448 unsigned long flags ;
466449#define AFS_VNODE_CB_PROMISED 0 /* Set if vnode has a callback promise */
@@ -476,7 +459,7 @@ struct afs_vnode {
476459#define AFS_VNODE_AUTOCELL 10 /* set if Vnode is an auto mount point */
477460#define AFS_VNODE_PSEUDODIR 11 /* set if Vnode is a pseudo directory */
478461
479- struct list_head writebacks ; /* alterations in pagecache that need writing */
462+ struct list_head wb_keys ; /* List of keys available for writeback */
480463 struct list_head pending_locks ; /* locks waiting to be granted */
481464 struct list_head granted_locks ; /* locks granted on this file */
482465 struct delayed_work lock_work ; /* work to be done in locking */
@@ -648,6 +631,8 @@ extern const struct address_space_operations afs_fs_aops;
648631extern const struct inode_operations afs_file_inode_operations ;
649632extern const struct file_operations afs_file_operations ;
650633
634+ extern int afs_cache_wb_key (struct afs_vnode * , struct afs_file * );
635+ extern void afs_put_wb_key (struct afs_wb_key * );
651636extern int afs_open (struct inode * , struct file * );
652637extern int afs_release (struct inode * , struct file * );
653638extern int afs_fetch_data (struct afs_vnode * , struct key * , struct afs_read * );
@@ -678,7 +663,7 @@ extern int afs_fs_symlink(struct afs_fs_cursor *, const char *, const char *,
678663 struct afs_fid * , struct afs_file_status * );
679664extern int afs_fs_rename (struct afs_fs_cursor * , const char * ,
680665 struct afs_vnode * , const char * );
681- extern int afs_fs_store_data (struct afs_fs_cursor * , struct afs_writeback * ,
666+ extern int afs_fs_store_data (struct afs_fs_cursor * , struct address_space * ,
682667 pgoff_t , pgoff_t , unsigned , unsigned );
683668extern int afs_fs_setattr (struct afs_fs_cursor * , struct iattr * );
684669extern int afs_fs_get_volume_status (struct afs_fs_cursor * , struct afs_volume_status * );
@@ -889,7 +874,6 @@ extern int afs_check_volume_status(struct afs_volume *, struct key *);
889874 * write.c
890875 */
891876extern int afs_set_page_dirty (struct page * );
892- extern void afs_put_writeback (struct afs_writeback * );
893877extern int afs_write_begin (struct file * file , struct address_space * mapping ,
894878 loff_t pos , unsigned len , unsigned flags ,
895879 struct page * * pagep , void * * fsdata );
@@ -900,9 +884,10 @@ extern int afs_writepage(struct page *, struct writeback_control *);
900884extern int afs_writepages (struct address_space * , struct writeback_control * );
901885extern void afs_pages_written_back (struct afs_vnode * , struct afs_call * );
902886extern ssize_t afs_file_write (struct kiocb * , struct iov_iter * );
903- extern int afs_writeback_all (struct afs_vnode * );
904887extern int afs_flush (struct file * , fl_owner_t );
905888extern int afs_fsync (struct file * , loff_t , loff_t , int );
889+ extern void afs_prune_wb_keys (struct afs_vnode * );
890+ extern int afs_launder_page (struct page * );
906891
907892/*
908893 * xattr.c
0 commit comments