📄 util.h
字号:
/* * linux/fs/ufs/util.h * * Copyright (C) 1998 * Daniel Pirkl <daniel.pirkl@email.cz> * Charles University, Faculty of Mathematics and Physics */#include <linux/fs.h>#include "swab.h"/* * some useful macros */#define in_range(b,first,len) ((b)>=(first)&&(b)<(first)+(len))#define min(x,y) ((x)<(y)?(x):(y))#define max(x,y) ((x)>(y)?(x):(y))/* * macros used for retyping */#define UCPI_UBH ((struct ufs_buffer_head *)ucpi)#define USPI_UBH ((struct ufs_buffer_head *)uspi)/* * macros used for accesing structures */#define ufs_get_fs_state(usb1,usb3) _ufs_get_fs_state_(usb1,usb3,flags,swab)static inline __s32 _ufs_get_fs_state_(struct ufs_super_block_first * usb1, struct ufs_super_block_third * usb3, unsigned flags, unsigned swab){ switch (flags & UFS_ST_MASK) { case UFS_ST_SUN: return SWAB32((usb3)->fs_u2.fs_sun.fs_state); case UFS_ST_SUNx86: return SWAB32((usb1)->fs_u1.fs_sunx86.fs_state); case UFS_ST_44BSD: default: return SWAB32((usb3)->fs_u2.fs_44.fs_state); }}#define ufs_set_fs_state(usb1,usb3,value) _ufs_set_fs_state_(usb1,usb3,value,flags,swab)static inline void _ufs_set_fs_state_(struct ufs_super_block_first * usb1, struct ufs_super_block_third * usb3, __s32 value, unsigned flags, unsigned swab){ switch (flags & UFS_ST_MASK) { case UFS_ST_SUN: (usb3)->fs_u2.fs_sun.fs_state = SWAB32(value); break; case UFS_ST_SUNx86: (usb1)->fs_u1.fs_sunx86.fs_state = SWAB32(value); break; case UFS_ST_44BSD: (usb3)->fs_u2.fs_44.fs_state = SWAB32(value); break; }}#define ufs_get_fs_npsect(usb1,usb3) _ufs_get_fs_npsect_(usb1,usb3,flags,swab)static inline __u32 _ufs_get_fs_npsect_(struct ufs_super_block_first * usb1, struct ufs_super_block_third * usb3, unsigned flags, unsigned swab){ if ((flags & UFS_ST_MASK) == UFS_ST_SUNx86) return SWAB32((usb3)->fs_u2.fs_sunx86.fs_npsect); else return SWAB32((usb1)->fs_u1.fs_sun.fs_npsect);}#define ufs_get_fs_qbmask(usb3) _ufs_get_fs_qbmask_(usb3,flags,swab)static inline __u64 _ufs_get_fs_qbmask_(struct ufs_super_block_third * usb3, unsigned flags, unsigned swab){ __u64 tmp; switch (flags & UFS_ST_MASK) { case UFS_ST_SUN: ((u32 *)&tmp)[0] = usb3->fs_u2.fs_sun.fs_qbmask[0]; ((u32 *)&tmp)[1] = usb3->fs_u2.fs_sun.fs_qbmask[1]; break; case UFS_ST_SUNx86: ((u32 *)&tmp)[0] = usb3->fs_u2.fs_sunx86.fs_qbmask[0]; ((u32 *)&tmp)[1] = usb3->fs_u2.fs_sunx86.fs_qbmask[1]; break; case UFS_ST_44BSD: ((u32 *)&tmp)[0] = usb3->fs_u2.fs_44.fs_qbmask[0]; ((u32 *)&tmp)[1] = usb3->fs_u2.fs_44.fs_qbmask[1]; break; } return SWAB64(tmp);}#define ufs_get_fs_qfmask(usb3) _ufs_get_fs_qfmask_(usb3,flags,swab)static inline __u64 _ufs_get_fs_qfmask_(struct ufs_super_block_third * usb3, unsigned flags, unsigned swab){ __u64 tmp; switch (flags & UFS_ST_MASK) { case UFS_ST_SUN: ((u32 *)&tmp)[0] = usb3->fs_u2.fs_sun.fs_qfmask[0]; ((u32 *)&tmp)[1] = usb3->fs_u2.fs_sun.fs_qfmask[1]; break; case UFS_ST_SUNx86: ((u32 *)&tmp)[0] = usb3->fs_u2.fs_sunx86.fs_qfmask[0]; ((u32 *)&tmp)[1] = usb3->fs_u2.fs_sunx86.fs_qfmask[1]; break; case UFS_ST_44BSD: ((u32 *)&tmp)[0] = usb3->fs_u2.fs_44.fs_qfmask[0]; ((u32 *)&tmp)[1] = usb3->fs_u2.fs_44.fs_qfmask[1]; break; } return SWAB64(tmp);}#define ufs_get_de_namlen(de) \ (((flags & UFS_DE_MASK) == UFS_DE_OLD) \ ? SWAB16(de->d_u.d_namlen) \ : de->d_u.d_44.d_namlen)#define ufs_set_de_namlen(de,value) \ (((flags & UFS_DE_MASK) == UFS_DE_OLD) \ ? (de->d_u.d_namlen = SWAB16(value)) \ : (de->d_u.d_44.d_namlen = value))#define ufs_set_de_type(de,mode) _ufs_set_de_type_(de,mode,flags,swab)static inline void _ufs_set_de_type_(struct ufs_dir_entry * de, int mode, unsigned flags, unsigned swab){ if ((flags & UFS_DE_MASK) == UFS_DE_44BSD) { switch (mode & S_IFMT) { case S_IFSOCK: de->d_u.d_44.d_type = DT_SOCK; break; case S_IFLNK: de->d_u.d_44.d_type = DT_LNK; break; case S_IFREG: de->d_u.d_44.d_type = DT_REG; break; case S_IFBLK: de->d_u.d_44.d_type = DT_BLK; break; case S_IFDIR: de->d_u.d_44.d_type = DT_DIR; break; case S_IFCHR: de->d_u.d_44.d_type = DT_CHR; break; case S_IFIFO: de->d_u.d_44.d_type = DT_FIFO; break; default: de->d_u.d_44.d_type = DT_UNKNOWN; } }}#define ufs_get_inode_uid(inode) _ufs_get_inode_uid_(inode,flags,swab)static inline __u32 _ufs_get_inode_uid_(struct ufs_inode * inode, unsigned flags, unsigned swab){ switch (flags & UFS_UID_MASK) { case UFS_UID_EFT: return SWAB32(inode->ui_u3.ui_sun.ui_uid); case UFS_UID_44BSD: return SWAB32(inode->ui_u3.ui_44.ui_uid); default: return SWAB16(inode->ui_u1.oldids.ui_suid); }}#define ufs_set_inode_uid(inode,value) _ufs_set_inode_uid_(inode,value,flags,swab)static inline void _ufs_set_inode_uid_(struct ufs_inode * inode, __u32 value, unsigned flags, unsigned swab){ inode->ui_u1.oldids.ui_suid = SWAB16(value); switch (flags & UFS_UID_MASK) { case UFS_UID_EFT: inode->ui_u3.ui_sun.ui_uid = SWAB32(value); break; case UFS_UID_44BSD: inode->ui_u3.ui_44.ui_uid = SWAB32(value); break; }}#define ufs_get_inode_gid(inode) _ufs_get_inode_gid_(inode,flags,swab)static inline __u32 _ufs_get_inode_gid_(struct ufs_inode * inode, unsigned flags, unsigned swab){ switch (flags & UFS_UID_MASK) { case UFS_UID_EFT: return SWAB32(inode->ui_u3.ui_sun.ui_gid); case UFS_UID_44BSD: return SWAB32(inode->ui_u3.ui_44.ui_gid); default: return SWAB16(inode->ui_u1.oldids.ui_sgid); }}#define ufs_set_inode_gid(inode,value) _ufs_set_inode_gid_(inode,value,flags,swab)static inline void _ufs_set_inode_gid_(struct ufs_inode * inode, __u32 value, unsigned flags, unsigned swab){ inode->ui_u1.oldids.ui_sgid = SWAB16(value); switch (flags & UFS_UID_MASK) { case UFS_UID_EFT: inode->ui_u3.ui_sun.ui_gid = SWAB32(value); break; case UFS_UID_44BSD: inode->ui_u3.ui_44.ui_gid = SWAB32(value); break; }}/* * These functions manipulate ufs buffers */#define ubh_bread(dev,fragment,size) _ubh_bread_(uspi,dev,fragment,size) extern struct ufs_buffer_head * _ubh_bread_(struct ufs_sb_private_info *, kdev_t, unsigned, unsigned);extern struct ufs_buffer_head * ubh_bread_uspi(struct ufs_sb_private_info *, kdev_t, unsigned, unsigned);extern void ubh_brelse (struct ufs_buffer_head *);extern void ubh_brelse_uspi (struct ufs_sb_private_info *);extern void ubh_mark_buffer_dirty (struct ufs_buffer_head *);extern void ubh_mark_buffer_uptodate (struct ufs_buffer_head *, int);extern void ubh_ll_rw_block (int, unsigned, struct ufs_buffer_head **);extern void ubh_wait_on_buffer (struct ufs_buffer_head *);extern unsigned ubh_max_bcount (struct ufs_buffer_head *);extern void ubh_bforget (struct ufs_buffer_head *);extern int ubh_buffer_dirty (struct ufs_buffer_head *);#define ubh_ubhcpymem(mem,ubh,size) _ubh_ubhcpymem_(uspi,mem,ubh,size)extern void _ubh_ubhcpymem_(struct ufs_sb_private_info *, unsigned char *, struct ufs_buffer_head *, unsigned);#define ubh_memcpyubh(ubh,mem,size) _ubh_memcpyubh_(uspi,ubh,mem,size)extern void _ubh_memcpyubh_(struct ufs_sb_private_info *, struct ufs_buffer_head *, unsigned char *, unsigned);/* * macros to get important structures from ufs_buffer_head */#define ubh_get_usb_first(ubh) \ ((struct ufs_super_block_first *)((ubh)->bh[0]->b_data))#define ubh_get_usb_second(ubh) \ ((struct ufs_super_block_second *)(ubh)-> \ bh[UFS_SECTOR_SIZE >> uspi->s_fshift]->b_data + (UFS_SECTOR_SIZE & ~uspi->s_fmask))#define ubh_get_usb_third(ubh) \ ((struct ufs_super_block_third *)((ubh)-> \ bh[UFS_SECTOR_SIZE*2 >> uspi->s_fshift]->b_data + (UFS_SECTOR_SIZE*2 & ~uspi->s_fmask)))#define ubh_get_ucg(ubh) \ ((struct ufs_cylinder_group *)((ubh)->bh[0]->b_data))/* * Extract byte from ufs_buffer_head * Extract the bits for a block from a map inside ufs_buffer_head */#define ubh_get_addr8(ubh,begin) \ ((u8*)(ubh)->bh[(begin) >> uspi->s_fshift]->b_data + \ ((begin) & ~uspi->s_fmask))
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -