📄 xfs_buf.h
字号:
/* * Copyright (c) 2000-2005 Silicon Graphics, Inc. * All Rights Reserved. * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation. * * This program is distributed in the hope that it would be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */#ifndef __XFS_BUF_H__#define __XFS_BUF_H__#include <linux/config.h>#include <linux/list.h>#include <linux/types.h>#include <linux/spinlock.h>#include <asm/system.h>#include <linux/mm.h>#include <linux/fs.h>#include <linux/buffer_head.h>#include <linux/uio.h>/* * Base types */#define XFS_BUF_DADDR_NULL ((xfs_daddr_t) (-1LL))#define page_buf_ctob(pp) ((pp) * PAGE_CACHE_SIZE)#define page_buf_btoc(dd) (((dd) + PAGE_CACHE_SIZE - 1) >> PAGE_CACHE_SHIFT)#define page_buf_btoct(dd) ((dd) >> PAGE_CACHE_SHIFT)#define page_buf_poff(aa) ((aa) & ~PAGE_CACHE_MASK)typedef enum page_buf_rw_e { PBRW_READ = 1, /* transfer into target memory */ PBRW_WRITE = 2, /* transfer from target memory */ PBRW_ZERO = 3 /* Zero target memory */} page_buf_rw_t;typedef enum page_buf_flags_e { /* pb_flags values */ PBF_READ = (1 << 0), /* buffer intended for reading from device */ PBF_WRITE = (1 << 1), /* buffer intended for writing to device */ PBF_MAPPED = (1 << 2), /* buffer mapped (pb_addr valid) */ PBF_ASYNC = (1 << 4), /* initiator will not wait for completion */ PBF_DONE = (1 << 5), /* all pages in the buffer uptodate */ PBF_DELWRI = (1 << 6), /* buffer has dirty pages */ PBF_STALE = (1 << 7), /* buffer has been staled, do not find it */ PBF_FS_MANAGED = (1 << 8), /* filesystem controls freeing memory */ PBF_ORDERED = (1 << 11), /* use ordered writes */ PBF_READ_AHEAD = (1 << 12), /* asynchronous read-ahead */ /* flags used only as arguments to access routines */ PBF_LOCK = (1 << 14), /* lock requested */ PBF_TRYLOCK = (1 << 15), /* lock requested, but do not wait */ PBF_DONT_BLOCK = (1 << 16), /* do not block in current thread */ /* flags used only internally */ _PBF_PAGE_CACHE = (1 << 17),/* backed by pagecache */ _PBF_KMEM_ALLOC = (1 << 18),/* backed by kmem_alloc() */ _PBF_RUN_QUEUES = (1 << 19),/* run block device task queue */ _PBF_DELWRI_Q = (1 << 21), /* buffer on delwri queue */} page_buf_flags_t;typedef struct xfs_bufhash { struct list_head bh_list; spinlock_t bh_lock;} xfs_bufhash_t;typedef struct xfs_buftarg { dev_t pbr_dev; struct block_device *pbr_bdev; struct address_space *pbr_mapping; unsigned int pbr_bsize; unsigned int pbr_sshift; size_t pbr_smask; /* per-device buffer hash table */ uint bt_hashmask; uint bt_hashshift; xfs_bufhash_t *bt_hash;} xfs_buftarg_t;/* * xfs_buf_t: Buffer structure for page cache-based buffers * * This buffer structure is used by the page cache buffer management routines * to refer to an assembly of pages forming a logical buffer. The actual I/O * is performed with buffer_head structures, as required by drivers. * * The buffer structure is used on temporary basis only, and discarded when * released. The real data storage is recorded in the page cache. Metadata is * hashed to the block device on which the file system resides. */struct xfs_buf;/* call-back function on I/O completion */typedef void (*page_buf_iodone_t)(struct xfs_buf *);/* call-back function on I/O completion */typedef void (*page_buf_relse_t)(struct xfs_buf *);/* pre-write function */typedef int (*page_buf_bdstrat_t)(struct xfs_buf *);#define PB_PAGES 2typedef struct xfs_buf { struct semaphore pb_sema; /* semaphore for lockables */ unsigned long pb_queuetime; /* time buffer was queued */ atomic_t pb_pin_count; /* pin count */ wait_queue_head_t pb_waiters; /* unpin waiters */ struct list_head pb_list; page_buf_flags_t pb_flags; /* status flags */ struct list_head pb_hash_list; /* hash table list */ xfs_bufhash_t *pb_hash; /* hash table list start */ xfs_buftarg_t *pb_target; /* buffer target (device) */ atomic_t pb_hold; /* reference count */ xfs_daddr_t pb_bn; /* block number for I/O */ loff_t pb_file_offset; /* offset in file */ size_t pb_buffer_length; /* size of buffer in bytes */ size_t pb_count_desired; /* desired transfer size */ void *pb_addr; /* virtual address of buffer */ struct work_struct pb_iodone_work; atomic_t pb_io_remaining;/* #outstanding I/O requests */ page_buf_iodone_t pb_iodone; /* I/O completion function */ page_buf_relse_t pb_relse; /* releasing function */ page_buf_bdstrat_t pb_strat; /* pre-write function */ struct semaphore pb_iodonesema; /* Semaphore for I/O waiters */ void *pb_fspriv; void *pb_fspriv2; void *pb_fspriv3; unsigned short pb_error; /* error code on I/O */ unsigned short pb_locked; /* page array is locked */ unsigned int pb_page_count; /* size of page array */ unsigned int pb_offset; /* page offset in first page */ struct page **pb_pages; /* array of page pointers */ struct page *pb_page_array[PB_PAGES]; /* inline pages */#ifdef PAGEBUF_LOCK_TRACKING int pb_last_holder;#endif} xfs_buf_t;/* Finding and Reading Buffers */extern xfs_buf_t *_pagebuf_find( /* find buffer for block if */ /* the block is in memory */ xfs_buftarg_t *, /* inode for block */ loff_t, /* starting offset of range */ size_t, /* length of range */ page_buf_flags_t, /* PBF_LOCK */ xfs_buf_t *); /* newly allocated buffer */#define xfs_incore(buftarg,blkno,len,lockit) \ _pagebuf_find(buftarg, blkno ,len, lockit, NULL)extern xfs_buf_t *xfs_buf_get_flags( /* allocate a buffer */ xfs_buftarg_t *, /* inode for buffer */ loff_t, /* starting offset of range */ size_t, /* length of range */ page_buf_flags_t); /* PBF_LOCK, PBF_READ, */ /* PBF_ASYNC */#define xfs_buf_get(target, blkno, len, flags) \ xfs_buf_get_flags((target), (blkno), (len), PBF_LOCK | PBF_MAPPED)extern xfs_buf_t *xfs_buf_read_flags( /* allocate and read a buffer */ xfs_buftarg_t *, /* inode for buffer */ loff_t, /* starting offset of range */ size_t, /* length of range */ page_buf_flags_t); /* PBF_LOCK, PBF_ASYNC */#define xfs_buf_read(target, blkno, len, flags) \ xfs_buf_read_flags((target), (blkno), (len), PBF_LOCK | PBF_MAPPED)extern xfs_buf_t *pagebuf_get_empty( /* allocate pagebuf struct with */ /* no memory or disk address */ size_t len, xfs_buftarg_t *); /* mount point "fake" inode */extern xfs_buf_t *pagebuf_get_no_daddr(/* allocate pagebuf struct */ /* without disk address */ size_t len, xfs_buftarg_t *); /* mount point "fake" inode */extern int pagebuf_associate_memory( xfs_buf_t *, void *, size_t);extern void pagebuf_hold( /* increment reference count */ xfs_buf_t *); /* buffer to hold */extern void pagebuf_readahead( /* read ahead into cache */ xfs_buftarg_t *, /* target for buffer (or NULL) */ loff_t, /* starting offset of range */ size_t, /* length of range */ page_buf_flags_t); /* additional read flags *//* Releasing Buffers */extern void pagebuf_free( /* deallocate a buffer */ xfs_buf_t *); /* buffer to deallocate */extern void pagebuf_rele( /* release hold on a buffer */ xfs_buf_t *); /* buffer to release *//* Locking and Unlocking Buffers */extern int pagebuf_cond_lock( /* lock buffer, if not locked */ /* (returns -EBUSY if locked) */ xfs_buf_t *); /* buffer to lock */extern int pagebuf_lock_value( /* return count on lock */ xfs_buf_t *); /* buffer to check */extern int pagebuf_lock( /* lock buffer */ xfs_buf_t *); /* buffer to lock */extern void pagebuf_unlock( /* unlock buffer */ xfs_buf_t *); /* buffer to unlock *//* Buffer Read and Write Routines */extern void pagebuf_iodone( /* mark buffer I/O complete */ xfs_buf_t *, /* buffer to mark */ int); /* run completion locally, or in * a helper thread. */extern void pagebuf_ioerror( /* mark buffer in error (or not) */ xfs_buf_t *, /* buffer to mark */ int); /* error to store (0 if none) */extern int pagebuf_iostart( /* start I/O on a buffer */ xfs_buf_t *, /* buffer to start */ page_buf_flags_t); /* PBF_LOCK, PBF_ASYNC, */ /* PBF_READ, PBF_WRITE, */ /* PBF_DELWRI */extern int pagebuf_iorequest( /* start real I/O */ xfs_buf_t *); /* buffer to convey to device */extern int pagebuf_iowait( /* wait for buffer I/O done */ xfs_buf_t *); /* buffer to wait on */extern void pagebuf_iomove( /* move data in/out of pagebuf */ xfs_buf_t *, /* buffer to manipulate */ size_t, /* starting buffer offset */ size_t, /* length in buffer */ caddr_t, /* data pointer */ page_buf_rw_t); /* direction */static inline int pagebuf_iostrategy(xfs_buf_t *pb){ return pb->pb_strat ? pb->pb_strat(pb) : pagebuf_iorequest(pb);}static inline int pagebuf_geterror(xfs_buf_t *pb){ return pb ? pb->pb_error : ENOMEM;}/* Buffer Utility Routines */extern caddr_t pagebuf_offset( /* pointer at offset in buffer */ xfs_buf_t *, /* buffer to offset into */ size_t); /* offset */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -