pnfs: add pnfs_put_lseg_async
This is useful when lsegs need to be released while holding locks. Signed-off-by: Weston Andros Adamson <dros@primarydata.com> Signed-off-by: Trond Myklebust <trond.myklebust@primarydata.com>
This commit is contained in:
		
					parent
					
						
							
								02d1426c70
							
						
					
				
			
			
				commit
				
					
						e6cf82d183
					
				
			
		
					 2 changed files with 24 additions and 0 deletions
				
			
		|  | @ -361,6 +361,23 @@ pnfs_put_lseg(struct pnfs_layout_segment *lseg) | ||||||
| } | } | ||||||
| EXPORT_SYMBOL_GPL(pnfs_put_lseg); | EXPORT_SYMBOL_GPL(pnfs_put_lseg); | ||||||
| 
 | 
 | ||||||
|  | static void pnfs_put_lseg_async_work(struct work_struct *work) | ||||||
|  | { | ||||||
|  | 	struct pnfs_layout_segment *lseg; | ||||||
|  | 
 | ||||||
|  | 	lseg = container_of(work, struct pnfs_layout_segment, pls_work); | ||||||
|  | 
 | ||||||
|  | 	pnfs_put_lseg(lseg); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void | ||||||
|  | pnfs_put_lseg_async(struct pnfs_layout_segment *lseg) | ||||||
|  | { | ||||||
|  | 	INIT_WORK(&lseg->pls_work, pnfs_put_lseg_async_work); | ||||||
|  | 	schedule_work(&lseg->pls_work); | ||||||
|  | } | ||||||
|  | EXPORT_SYMBOL_GPL(pnfs_put_lseg_async); | ||||||
|  | 
 | ||||||
| static u64 | static u64 | ||||||
| end_offset(u64 start, u64 len) | end_offset(u64 start, u64 len) | ||||||
| { | { | ||||||
|  |  | ||||||
|  | @ -32,6 +32,7 @@ | ||||||
| 
 | 
 | ||||||
| #include <linux/nfs_fs.h> | #include <linux/nfs_fs.h> | ||||||
| #include <linux/nfs_page.h> | #include <linux/nfs_page.h> | ||||||
|  | #include <linux/workqueue.h> | ||||||
| 
 | 
 | ||||||
| enum { | enum { | ||||||
| 	NFS_LSEG_VALID = 0,	/* cleared when lseg is recalled/returned */ | 	NFS_LSEG_VALID = 0,	/* cleared when lseg is recalled/returned */ | ||||||
|  | @ -46,6 +47,7 @@ struct pnfs_layout_segment { | ||||||
| 	atomic_t pls_refcount; | 	atomic_t pls_refcount; | ||||||
| 	unsigned long pls_flags; | 	unsigned long pls_flags; | ||||||
| 	struct pnfs_layout_hdr *pls_layout; | 	struct pnfs_layout_hdr *pls_layout; | ||||||
|  | 	struct work_struct pls_work; | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| enum pnfs_try_status { | enum pnfs_try_status { | ||||||
|  | @ -181,6 +183,7 @@ extern int nfs4_proc_layoutreturn(struct nfs4_layoutreturn *lrp); | ||||||
| /* pnfs.c */ | /* pnfs.c */ | ||||||
| void pnfs_get_layout_hdr(struct pnfs_layout_hdr *lo); | void pnfs_get_layout_hdr(struct pnfs_layout_hdr *lo); | ||||||
| void pnfs_put_lseg(struct pnfs_layout_segment *lseg); | void pnfs_put_lseg(struct pnfs_layout_segment *lseg); | ||||||
|  | void pnfs_put_lseg_async(struct pnfs_layout_segment *lseg); | ||||||
| 
 | 
 | ||||||
| void set_pnfs_layoutdriver(struct nfs_server *, const struct nfs_fh *, u32); | void set_pnfs_layoutdriver(struct nfs_server *, const struct nfs_fh *, u32); | ||||||
| void unset_pnfs_layoutdriver(struct nfs_server *); | void unset_pnfs_layoutdriver(struct nfs_server *); | ||||||
|  | @ -419,6 +422,10 @@ static inline void pnfs_put_lseg(struct pnfs_layout_segment *lseg) | ||||||
| { | { | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | static inline void pnfs_put_lseg_async(struct pnfs_layout_segment *lseg) | ||||||
|  | { | ||||||
|  | } | ||||||
|  | 
 | ||||||
| static inline int pnfs_return_layout(struct inode *ino) | static inline int pnfs_return_layout(struct inode *ino) | ||||||
| { | { | ||||||
| 	return 0; | 	return 0; | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Weston Andros Adamson
				Weston Andros Adamson