cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

util.h (17183B)


      1/* SPDX-License-Identifier: GPL-2.0 */
      2/*
      3 *  linux/fs/ufs/util.h
      4 *
      5 * Copyright (C) 1998 
      6 * Daniel Pirkl <daniel.pirkl@email.cz>
      7 * Charles University, Faculty of Mathematics and Physics
      8 */
      9
     10#include <linux/buffer_head.h>
     11#include <linux/fs.h>
     12#include "swab.h"
     13
     14
     15/*
     16 * some useful macros
     17 */
     18#define in_range(b,first,len)	((b)>=(first)&&(b)<(first)+(len))
     19
     20/*
     21 * functions used for retyping
     22 */
     23static inline struct ufs_buffer_head *UCPI_UBH(struct ufs_cg_private_info *cpi)
     24{
     25	return &cpi->c_ubh;
     26}
     27static inline struct ufs_buffer_head *USPI_UBH(struct ufs_sb_private_info *spi)
     28{
     29	return &spi->s_ubh;
     30}
     31
     32
     33
     34/*
     35 * macros used for accessing structures
     36 */
     37static inline s32
     38ufs_get_fs_state(struct super_block *sb, struct ufs_super_block_first *usb1,
     39		 struct ufs_super_block_third *usb3)
     40{
     41	switch (UFS_SB(sb)->s_flags & UFS_ST_MASK) {
     42	case UFS_ST_SUNOS:
     43		if (fs32_to_cpu(sb, usb3->fs_postblformat) == UFS_42POSTBLFMT)
     44			return fs32_to_cpu(sb, usb1->fs_u0.fs_sun.fs_state);
     45		fallthrough;	/* to UFS_ST_SUN */
     46	case UFS_ST_SUN:
     47		return fs32_to_cpu(sb, usb3->fs_un2.fs_sun.fs_state);
     48	case UFS_ST_SUNx86:
     49		return fs32_to_cpu(sb, usb1->fs_u1.fs_sunx86.fs_state);
     50	case UFS_ST_44BSD:
     51	default:
     52		return fs32_to_cpu(sb, usb3->fs_un2.fs_44.fs_state);
     53	}
     54}
     55
     56static inline void
     57ufs_set_fs_state(struct super_block *sb, struct ufs_super_block_first *usb1,
     58		 struct ufs_super_block_third *usb3, s32 value)
     59{
     60	switch (UFS_SB(sb)->s_flags & UFS_ST_MASK) {
     61	case UFS_ST_SUNOS:
     62		if (fs32_to_cpu(sb, usb3->fs_postblformat) == UFS_42POSTBLFMT) {
     63			usb1->fs_u0.fs_sun.fs_state = cpu_to_fs32(sb, value);
     64			break;
     65		}
     66		fallthrough;	/* to UFS_ST_SUN */
     67	case UFS_ST_SUN:
     68		usb3->fs_un2.fs_sun.fs_state = cpu_to_fs32(sb, value);
     69		break;
     70	case UFS_ST_SUNx86:
     71		usb1->fs_u1.fs_sunx86.fs_state = cpu_to_fs32(sb, value);
     72		break;
     73	case UFS_ST_44BSD:
     74		usb3->fs_un2.fs_44.fs_state = cpu_to_fs32(sb, value);
     75		break;
     76	}
     77}
     78
     79static inline u32
     80ufs_get_fs_npsect(struct super_block *sb, struct ufs_super_block_first *usb1,
     81		  struct ufs_super_block_third *usb3)
     82{
     83	if ((UFS_SB(sb)->s_flags & UFS_ST_MASK) == UFS_ST_SUNx86)
     84		return fs32_to_cpu(sb, usb3->fs_un2.fs_sunx86.fs_npsect);
     85	else
     86		return fs32_to_cpu(sb, usb1->fs_u1.fs_sun.fs_npsect);
     87}
     88
     89static inline u64
     90ufs_get_fs_qbmask(struct super_block *sb, struct ufs_super_block_third *usb3)
     91{
     92	__fs64 tmp;
     93
     94	switch (UFS_SB(sb)->s_flags & UFS_ST_MASK) {
     95	case UFS_ST_SUNOS:
     96	case UFS_ST_SUN:
     97		((__fs32 *)&tmp)[0] = usb3->fs_un2.fs_sun.fs_qbmask[0];
     98		((__fs32 *)&tmp)[1] = usb3->fs_un2.fs_sun.fs_qbmask[1];
     99		break;
    100	case UFS_ST_SUNx86:
    101		((__fs32 *)&tmp)[0] = usb3->fs_un2.fs_sunx86.fs_qbmask[0];
    102		((__fs32 *)&tmp)[1] = usb3->fs_un2.fs_sunx86.fs_qbmask[1];
    103		break;
    104	case UFS_ST_44BSD:
    105		((__fs32 *)&tmp)[0] = usb3->fs_un2.fs_44.fs_qbmask[0];
    106		((__fs32 *)&tmp)[1] = usb3->fs_un2.fs_44.fs_qbmask[1];
    107		break;
    108	}
    109
    110	return fs64_to_cpu(sb, tmp);
    111}
    112
    113static inline u64
    114ufs_get_fs_qfmask(struct super_block *sb, struct ufs_super_block_third *usb3)
    115{
    116	__fs64 tmp;
    117
    118	switch (UFS_SB(sb)->s_flags & UFS_ST_MASK) {
    119	case UFS_ST_SUNOS:
    120	case UFS_ST_SUN:
    121		((__fs32 *)&tmp)[0] = usb3->fs_un2.fs_sun.fs_qfmask[0];
    122		((__fs32 *)&tmp)[1] = usb3->fs_un2.fs_sun.fs_qfmask[1];
    123		break;
    124	case UFS_ST_SUNx86:
    125		((__fs32 *)&tmp)[0] = usb3->fs_un2.fs_sunx86.fs_qfmask[0];
    126		((__fs32 *)&tmp)[1] = usb3->fs_un2.fs_sunx86.fs_qfmask[1];
    127		break;
    128	case UFS_ST_44BSD:
    129		((__fs32 *)&tmp)[0] = usb3->fs_un2.fs_44.fs_qfmask[0];
    130		((__fs32 *)&tmp)[1] = usb3->fs_un2.fs_44.fs_qfmask[1];
    131		break;
    132	}
    133
    134	return fs64_to_cpu(sb, tmp);
    135}
    136
    137static inline u16
    138ufs_get_de_namlen(struct super_block *sb, struct ufs_dir_entry *de)
    139{
    140	if ((UFS_SB(sb)->s_flags & UFS_DE_MASK) == UFS_DE_OLD)
    141		return fs16_to_cpu(sb, de->d_u.d_namlen);
    142	else
    143		return de->d_u.d_44.d_namlen; /* XXX this seems wrong */
    144}
    145
    146static inline void
    147ufs_set_de_namlen(struct super_block *sb, struct ufs_dir_entry *de, u16 value)
    148{
    149	if ((UFS_SB(sb)->s_flags & UFS_DE_MASK) == UFS_DE_OLD)
    150		de->d_u.d_namlen = cpu_to_fs16(sb, value);
    151	else
    152		de->d_u.d_44.d_namlen = value; /* XXX this seems wrong */
    153}
    154
    155static inline void
    156ufs_set_de_type(struct super_block *sb, struct ufs_dir_entry *de, int mode)
    157{
    158	if ((UFS_SB(sb)->s_flags & UFS_DE_MASK) != UFS_DE_44BSD)
    159		return;
    160
    161	/*
    162	 * TODO turn this into a table lookup
    163	 */
    164	switch (mode & S_IFMT) {
    165	case S_IFSOCK:
    166		de->d_u.d_44.d_type = DT_SOCK;
    167		break;
    168	case S_IFLNK:
    169		de->d_u.d_44.d_type = DT_LNK;
    170		break;
    171	case S_IFREG:
    172		de->d_u.d_44.d_type = DT_REG;
    173		break;
    174	case S_IFBLK:
    175		de->d_u.d_44.d_type = DT_BLK;
    176		break;
    177	case S_IFDIR:
    178		de->d_u.d_44.d_type = DT_DIR;
    179		break;
    180	case S_IFCHR:
    181		de->d_u.d_44.d_type = DT_CHR;
    182		break;
    183	case S_IFIFO:
    184		de->d_u.d_44.d_type = DT_FIFO;
    185		break;
    186	default:
    187		de->d_u.d_44.d_type = DT_UNKNOWN;
    188	}
    189}
    190
    191static inline u32
    192ufs_get_inode_uid(struct super_block *sb, struct ufs_inode *inode)
    193{
    194	switch (UFS_SB(sb)->s_flags & UFS_UID_MASK) {
    195	case UFS_UID_44BSD:
    196		return fs32_to_cpu(sb, inode->ui_u3.ui_44.ui_uid);
    197	case UFS_UID_EFT:
    198		if (inode->ui_u1.oldids.ui_suid == 0xFFFF)
    199			return fs32_to_cpu(sb, inode->ui_u3.ui_sun.ui_uid);
    200		fallthrough;
    201	default:
    202		return fs16_to_cpu(sb, inode->ui_u1.oldids.ui_suid);
    203	}
    204}
    205
    206static inline void
    207ufs_set_inode_uid(struct super_block *sb, struct ufs_inode *inode, u32 value)
    208{
    209	switch (UFS_SB(sb)->s_flags & UFS_UID_MASK) {
    210	case UFS_UID_44BSD:
    211		inode->ui_u3.ui_44.ui_uid = cpu_to_fs32(sb, value);
    212		inode->ui_u1.oldids.ui_suid = cpu_to_fs16(sb, value);
    213		break;
    214	case UFS_UID_EFT:
    215		inode->ui_u3.ui_sun.ui_uid = cpu_to_fs32(sb, value);
    216		if (value > 0xFFFF)
    217			value = 0xFFFF;
    218		fallthrough;
    219	default:
    220		inode->ui_u1.oldids.ui_suid = cpu_to_fs16(sb, value);
    221		break;
    222	}
    223}
    224
    225static inline u32
    226ufs_get_inode_gid(struct super_block *sb, struct ufs_inode *inode)
    227{
    228	switch (UFS_SB(sb)->s_flags & UFS_UID_MASK) {
    229	case UFS_UID_44BSD:
    230		return fs32_to_cpu(sb, inode->ui_u3.ui_44.ui_gid);
    231	case UFS_UID_EFT:
    232		if (inode->ui_u1.oldids.ui_sgid == 0xFFFF)
    233			return fs32_to_cpu(sb, inode->ui_u3.ui_sun.ui_gid);
    234		fallthrough;
    235	default:
    236		return fs16_to_cpu(sb, inode->ui_u1.oldids.ui_sgid);
    237	}
    238}
    239
    240static inline void
    241ufs_set_inode_gid(struct super_block *sb, struct ufs_inode *inode, u32 value)
    242{
    243	switch (UFS_SB(sb)->s_flags & UFS_UID_MASK) {
    244	case UFS_UID_44BSD:
    245		inode->ui_u3.ui_44.ui_gid = cpu_to_fs32(sb, value);
    246		inode->ui_u1.oldids.ui_sgid =  cpu_to_fs16(sb, value);
    247		break;
    248	case UFS_UID_EFT:
    249		inode->ui_u3.ui_sun.ui_gid = cpu_to_fs32(sb, value);
    250		if (value > 0xFFFF)
    251			value = 0xFFFF;
    252		fallthrough;
    253	default:
    254		inode->ui_u1.oldids.ui_sgid =  cpu_to_fs16(sb, value);
    255		break;
    256	}
    257}
    258
    259extern dev_t ufs_get_inode_dev(struct super_block *, struct ufs_inode_info *);
    260extern void ufs_set_inode_dev(struct super_block *, struct ufs_inode_info *, dev_t);
    261extern int ufs_prepare_chunk(struct page *page, loff_t pos, unsigned len);
    262
    263/*
    264 * These functions manipulate ufs buffers
    265 */
    266#define ubh_bread(sb,fragment,size) _ubh_bread_(uspi,sb,fragment,size)  
    267extern struct ufs_buffer_head * _ubh_bread_(struct ufs_sb_private_info *, struct super_block *, u64 , u64);
    268extern struct ufs_buffer_head * ubh_bread_uspi(struct ufs_sb_private_info *, struct super_block *, u64, u64);
    269extern void ubh_brelse (struct ufs_buffer_head *);
    270extern void ubh_brelse_uspi (struct ufs_sb_private_info *);
    271extern void ubh_mark_buffer_dirty (struct ufs_buffer_head *);
    272extern void ubh_mark_buffer_uptodate (struct ufs_buffer_head *, int);
    273extern void ubh_sync_block(struct ufs_buffer_head *);
    274extern void ubh_bforget (struct ufs_buffer_head *);
    275extern int  ubh_buffer_dirty (struct ufs_buffer_head *);
    276#define ubh_ubhcpymem(mem,ubh,size) _ubh_ubhcpymem_(uspi,mem,ubh,size)
    277extern void _ubh_ubhcpymem_(struct ufs_sb_private_info *, unsigned char *, struct ufs_buffer_head *, unsigned);
    278#define ubh_memcpyubh(ubh,mem,size) _ubh_memcpyubh_(uspi,ubh,mem,size)
    279extern void _ubh_memcpyubh_(struct ufs_sb_private_info *, struct ufs_buffer_head *, unsigned char *, unsigned);
    280
    281/* This functions works with cache pages*/
    282extern struct page *ufs_get_locked_page(struct address_space *mapping,
    283					pgoff_t index);
    284static inline void ufs_put_locked_page(struct page *page)
    285{
    286       unlock_page(page);
    287       put_page(page);
    288}
    289
    290
    291/*
    292 * macros and inline function to get important structures from ufs_sb_private_info
    293 */
    294
    295static inline void *get_usb_offset(struct ufs_sb_private_info *uspi,
    296				   unsigned int offset)
    297{
    298	unsigned int index;
    299	
    300	index = offset >> uspi->s_fshift;
    301	offset &= ~uspi->s_fmask;
    302	return uspi->s_ubh.bh[index]->b_data + offset;
    303}
    304
    305#define ubh_get_usb_first(uspi) \
    306	((struct ufs_super_block_first *)get_usb_offset((uspi), 0))
    307
    308#define ubh_get_usb_second(uspi) \
    309	((struct ufs_super_block_second *)get_usb_offset((uspi), UFS_SECTOR_SIZE))
    310
    311#define ubh_get_usb_third(uspi)	\
    312	((struct ufs_super_block_third *)get_usb_offset((uspi), 2*UFS_SECTOR_SIZE))
    313
    314
    315#define ubh_get_ucg(ubh) \
    316	((struct ufs_cylinder_group *)((ubh)->bh[0]->b_data))
    317
    318
    319/*
    320 * Extract byte from ufs_buffer_head
    321 * Extract the bits for a block from a map inside ufs_buffer_head
    322 */
    323#define ubh_get_addr8(ubh,begin) \
    324	((u8*)(ubh)->bh[(begin) >> uspi->s_fshift]->b_data + \
    325	((begin) & ~uspi->s_fmask))
    326
    327#define ubh_get_addr16(ubh,begin) \
    328	(((__fs16*)((ubh)->bh[(begin) >> (uspi->s_fshift-1)]->b_data)) + \
    329	((begin) & ((uspi->fsize>>1) - 1)))
    330
    331#define ubh_get_addr32(ubh,begin) \
    332	(((__fs32*)((ubh)->bh[(begin) >> (uspi->s_fshift-2)]->b_data)) + \
    333	((begin) & ((uspi->s_fsize>>2) - 1)))
    334
    335#define ubh_get_addr64(ubh,begin) \
    336	(((__fs64*)((ubh)->bh[(begin) >> (uspi->s_fshift-3)]->b_data)) + \
    337	((begin) & ((uspi->s_fsize>>3) - 1)))
    338
    339#define ubh_get_addr ubh_get_addr8
    340
    341static inline void *ubh_get_data_ptr(struct ufs_sb_private_info *uspi,
    342				     struct ufs_buffer_head *ubh,
    343				     u64 blk)
    344{
    345	if (uspi->fs_magic == UFS2_MAGIC)
    346		return ubh_get_addr64(ubh, blk);
    347	else
    348		return ubh_get_addr32(ubh, blk);
    349}
    350
    351#define ubh_blkmap(ubh,begin,bit) \
    352	((*ubh_get_addr(ubh, (begin) + ((bit) >> 3)) >> ((bit) & 7)) & (0xff >> (UFS_MAXFRAG - uspi->s_fpb)))
    353
    354static inline u64
    355ufs_freefrags(struct ufs_sb_private_info *uspi)
    356{
    357	return ufs_blkstofrags(uspi->cs_total.cs_nbfree) +
    358		uspi->cs_total.cs_nffree;
    359}
    360
    361/*
    362 * Macros to access cylinder group array structures
    363 */
    364#define ubh_cg_blktot(ucpi,cylno) \
    365	(*((__fs32*)ubh_get_addr(UCPI_UBH(ucpi), (ucpi)->c_btotoff + ((cylno) << 2))))
    366
    367#define ubh_cg_blks(ucpi,cylno,rpos) \
    368	(*((__fs16*)ubh_get_addr(UCPI_UBH(ucpi), \
    369	(ucpi)->c_boff + (((cylno) * uspi->s_nrpos + (rpos)) << 1 ))))
    370
    371/*
    372 * Bitmap operations
    373 * These functions work like classical bitmap operations.
    374 * The difference is that we don't have the whole bitmap
    375 * in one contiguous chunk of memory, but in several buffers.
    376 * The parameters of each function are super_block, ufs_buffer_head and
    377 * position of the beginning of the bitmap.
    378 */
    379#define ubh_setbit(ubh,begin,bit) \
    380	(*ubh_get_addr(ubh, (begin) + ((bit) >> 3)) |= (1 << ((bit) & 7)))
    381
    382#define ubh_clrbit(ubh,begin,bit) \
    383	(*ubh_get_addr (ubh, (begin) + ((bit) >> 3)) &= ~(1 << ((bit) & 7)))
    384
    385#define ubh_isset(ubh,begin,bit) \
    386	(*ubh_get_addr (ubh, (begin) + ((bit) >> 3)) & (1 << ((bit) & 7)))
    387
    388#define ubh_isclr(ubh,begin,bit) (!ubh_isset(ubh,begin,bit))
    389
    390#define ubh_find_first_zero_bit(ubh,begin,size) _ubh_find_next_zero_bit_(uspi,ubh,begin,size,0)
    391
    392#define ubh_find_next_zero_bit(ubh,begin,size,offset) _ubh_find_next_zero_bit_(uspi,ubh,begin,size,offset)
    393static inline unsigned _ubh_find_next_zero_bit_(
    394	struct ufs_sb_private_info * uspi, struct ufs_buffer_head * ubh,
    395	unsigned begin, unsigned size, unsigned offset)
    396{
    397	unsigned base, count, pos;
    398
    399	size -= offset;
    400	begin <<= 3;
    401	offset += begin;
    402	base = offset >> uspi->s_bpfshift;
    403	offset &= uspi->s_bpfmask;
    404	for (;;) {
    405		count = min_t(unsigned int, size + offset, uspi->s_bpf);
    406		size -= count - offset;
    407		pos = find_next_zero_bit_le(ubh->bh[base]->b_data, count, offset);
    408		if (pos < count || !size)
    409			break;
    410		base++;
    411		offset = 0;
    412	}
    413	return (base << uspi->s_bpfshift) + pos - begin;
    414} 	
    415
    416static inline unsigned find_last_zero_bit (unsigned char * bitmap,
    417	unsigned size, unsigned offset)
    418{
    419	unsigned bit, i;
    420	unsigned char * mapp;
    421	unsigned char map;
    422
    423	mapp = bitmap + (size >> 3);
    424	map = *mapp--;
    425	bit = 1 << (size & 7);
    426	for (i = size; i > offset; i--) {
    427		if ((map & bit) == 0)
    428			break;
    429		if ((i & 7) != 0) {
    430			bit >>= 1;
    431		} else {
    432			map = *mapp--;
    433			bit = 1 << 7;
    434		}
    435	}
    436	return i;
    437}
    438
    439#define ubh_find_last_zero_bit(ubh,begin,size,offset) _ubh_find_last_zero_bit_(uspi,ubh,begin,size,offset)
    440static inline unsigned _ubh_find_last_zero_bit_(
    441	struct ufs_sb_private_info * uspi, struct ufs_buffer_head * ubh,
    442	unsigned begin, unsigned start, unsigned end)
    443{
    444	unsigned base, count, pos, size;
    445
    446	size = start - end;
    447	begin <<= 3;
    448	start += begin;
    449	base = start >> uspi->s_bpfshift;
    450	start &= uspi->s_bpfmask;
    451	for (;;) {
    452		count = min_t(unsigned int,
    453			    size + (uspi->s_bpf - start), uspi->s_bpf)
    454			- (uspi->s_bpf - start);
    455		size -= count;
    456		pos = find_last_zero_bit (ubh->bh[base]->b_data,
    457			start, start - count);
    458		if (pos > start - count || !size)
    459			break;
    460		base--;
    461		start = uspi->s_bpf;
    462	}
    463	return (base << uspi->s_bpfshift) + pos - begin;
    464} 	
    465
    466#define ubh_isblockclear(ubh,begin,block) (!_ubh_isblockset_(uspi,ubh,begin,block))
    467
    468#define ubh_isblockset(ubh,begin,block) _ubh_isblockset_(uspi,ubh,begin,block)
    469static inline int _ubh_isblockset_(struct ufs_sb_private_info * uspi,
    470	struct ufs_buffer_head * ubh, unsigned begin, unsigned block)
    471{
    472	u8 mask;
    473	switch (uspi->s_fpb) {
    474	case 8:
    475	    	return (*ubh_get_addr (ubh, begin + block) == 0xff);
    476	case 4:
    477		mask = 0x0f << ((block & 0x01) << 2);
    478		return (*ubh_get_addr (ubh, begin + (block >> 1)) & mask) == mask;
    479	case 2:
    480		mask = 0x03 << ((block & 0x03) << 1);
    481		return (*ubh_get_addr (ubh, begin + (block >> 2)) & mask) == mask;
    482	case 1:
    483		mask = 0x01 << (block & 0x07);
    484		return (*ubh_get_addr (ubh, begin + (block >> 3)) & mask) == mask;
    485	}
    486	return 0;	
    487}
    488
    489#define ubh_clrblock(ubh,begin,block) _ubh_clrblock_(uspi,ubh,begin,block)
    490static inline void _ubh_clrblock_(struct ufs_sb_private_info * uspi,
    491	struct ufs_buffer_head * ubh, unsigned begin, unsigned block)
    492{
    493	switch (uspi->s_fpb) {
    494	case 8:
    495	    	*ubh_get_addr (ubh, begin + block) = 0x00;
    496	    	return; 
    497	case 4:
    498		*ubh_get_addr (ubh, begin + (block >> 1)) &= ~(0x0f << ((block & 0x01) << 2));
    499		return;
    500	case 2:
    501		*ubh_get_addr (ubh, begin + (block >> 2)) &= ~(0x03 << ((block & 0x03) << 1));
    502		return;
    503	case 1:
    504		*ubh_get_addr (ubh, begin + (block >> 3)) &= ~(0x01 << ((block & 0x07)));
    505		return;
    506	}
    507}
    508
    509#define ubh_setblock(ubh,begin,block) _ubh_setblock_(uspi,ubh,begin,block)
    510static inline void _ubh_setblock_(struct ufs_sb_private_info * uspi,
    511	struct ufs_buffer_head * ubh, unsigned begin, unsigned block)
    512{
    513	switch (uspi->s_fpb) {
    514	case 8:
    515	    	*ubh_get_addr(ubh, begin + block) = 0xff;
    516	    	return;
    517	case 4:
    518		*ubh_get_addr(ubh, begin + (block >> 1)) |= (0x0f << ((block & 0x01) << 2));
    519		return;
    520	case 2:
    521		*ubh_get_addr(ubh, begin + (block >> 2)) |= (0x03 << ((block & 0x03) << 1));
    522		return;
    523	case 1:
    524		*ubh_get_addr(ubh, begin + (block >> 3)) |= (0x01 << ((block & 0x07)));
    525		return;
    526	}
    527}
    528
    529static inline void ufs_fragacct (struct super_block * sb, unsigned blockmap,
    530	__fs32 * fraglist, int cnt)
    531{
    532	struct ufs_sb_private_info * uspi;
    533	unsigned fragsize, pos;
    534	
    535	uspi = UFS_SB(sb)->s_uspi;
    536	
    537	fragsize = 0;
    538	for (pos = 0; pos < uspi->s_fpb; pos++) {
    539		if (blockmap & (1 << pos)) {
    540			fragsize++;
    541		}
    542		else if (fragsize > 0) {
    543			fs32_add(sb, &fraglist[fragsize], cnt);
    544			fragsize = 0;
    545		}
    546	}
    547	if (fragsize > 0 && fragsize < uspi->s_fpb)
    548		fs32_add(sb, &fraglist[fragsize], cnt);
    549}
    550
    551static inline void *ufs_get_direct_data_ptr(struct ufs_sb_private_info *uspi,
    552					    struct ufs_inode_info *ufsi,
    553					    unsigned blk)
    554{
    555	BUG_ON(blk > UFS_TIND_BLOCK);
    556	return uspi->fs_magic == UFS2_MAGIC ?
    557		(void *)&ufsi->i_u1.u2_i_data[blk] :
    558		(void *)&ufsi->i_u1.i_data[blk];
    559}
    560
    561static inline u64 ufs_data_ptr_to_cpu(struct super_block *sb, void *p)
    562{
    563	return UFS_SB(sb)->s_uspi->fs_magic == UFS2_MAGIC ?
    564		fs64_to_cpu(sb, *(__fs64 *)p) :
    565		fs32_to_cpu(sb, *(__fs32 *)p);
    566}
    567
    568static inline void ufs_cpu_to_data_ptr(struct super_block *sb, void *p, u64 val)
    569{
    570	if (UFS_SB(sb)->s_uspi->fs_magic == UFS2_MAGIC)
    571		*(__fs64 *)p = cpu_to_fs64(sb, val);
    572	else
    573		*(__fs32 *)p = cpu_to_fs32(sb, val);
    574}
    575
    576static inline void ufs_data_ptr_clear(struct ufs_sb_private_info *uspi,
    577				      void *p)
    578{
    579	if (uspi->fs_magic == UFS2_MAGIC)
    580		*(__fs64 *)p = 0;
    581	else
    582		*(__fs32 *)p = 0;
    583}
    584
    585static inline int ufs_is_data_ptr_zero(struct ufs_sb_private_info *uspi,
    586				       void *p)
    587{
    588	if (uspi->fs_magic == UFS2_MAGIC)
    589		return *(__fs64 *)p == 0;
    590	else
    591		return *(__fs32 *)p == 0;
    592}
    593
    594static inline __fs32 ufs_get_seconds(struct super_block *sbp)
    595{
    596	time64_t now = ktime_get_real_seconds();
    597
    598	/* Signed 32-bit interpretation wraps around in 2038, which
    599	 * happens in ufs1 inode stamps but not ufs2 using 64-bits
    600	 * stamps. For superblock and blockgroup, let's assume
    601	 * unsigned 32-bit stamps, which are good until y2106.
    602	 * Wrap around rather than clamp here to make the dirty
    603	 * file system detection work in the superblock stamp.
    604	 */
    605	return cpu_to_fs32(sbp, lower_32_bits(now));
    606}