11da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* 21da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * linux/fs/ufs/util.h 31da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 41da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Copyright (C) 1998 51da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Daniel Pirkl <daniel.pirkl@email.cz> 61da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Charles University, Faculty of Mathematics and Physics 71da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 81da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 91da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/buffer_head.h> 101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/fs.h> 111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include "swab.h" 121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* 151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * some useful macros 161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define in_range(b,first,len) ((b)>=(first)&&(b)<(first)+(len)) 181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* 209695ef16ed4e00b59303f39f9a4a422a2c6a3b89Evgeniy Dushistov * functions used for retyping 211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 229695ef16ed4e00b59303f39f9a4a422a2c6a3b89Evgeniy Dushistovstatic inline struct ufs_buffer_head *UCPI_UBH(struct ufs_cg_private_info *cpi) 239695ef16ed4e00b59303f39f9a4a422a2c6a3b89Evgeniy Dushistov{ 249695ef16ed4e00b59303f39f9a4a422a2c6a3b89Evgeniy Dushistov return &cpi->c_ubh; 259695ef16ed4e00b59303f39f9a4a422a2c6a3b89Evgeniy Dushistov} 269695ef16ed4e00b59303f39f9a4a422a2c6a3b89Evgeniy Dushistovstatic inline struct ufs_buffer_head *USPI_UBH(struct ufs_sb_private_info *spi) 279695ef16ed4e00b59303f39f9a4a422a2c6a3b89Evgeniy Dushistov{ 289695ef16ed4e00b59303f39f9a4a422a2c6a3b89Evgeniy Dushistov return &spi->s_ubh; 299695ef16ed4e00b59303f39f9a4a422a2c6a3b89Evgeniy Dushistov} 301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* 341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * macros used for accessing structures 351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic inline s32 371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsufs_get_fs_state(struct super_block *sb, struct ufs_super_block_first *usb1, 381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct ufs_super_block_third *usb3) 391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds switch (UFS_SB(sb)->s_flags & UFS_ST_MASK) { 41252e211e90ce56bf005cb533ad5a297c18c19407Mark Fortescue case UFS_ST_SUNOS: 42252e211e90ce56bf005cb533ad5a297c18c19407Mark Fortescue if (fs32_to_cpu(sb, usb3->fs_postblformat) == UFS_42POSTBLFMT) 43252e211e90ce56bf005cb533ad5a297c18c19407Mark Fortescue return fs32_to_cpu(sb, usb1->fs_u0.fs_sun.fs_state); 44252e211e90ce56bf005cb533ad5a297c18c19407Mark Fortescue /* Fall Through to UFS_ST_SUN */ 451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case UFS_ST_SUN: 46647b7e87b56f594daf648f44abfbeeb5eb6a9457Evgeniy Dushistov return fs32_to_cpu(sb, usb3->fs_un2.fs_sun.fs_state); 471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case UFS_ST_SUNx86: 481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return fs32_to_cpu(sb, usb1->fs_u1.fs_sunx86.fs_state); 491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case UFS_ST_44BSD: 501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds default: 51647b7e87b56f594daf648f44abfbeeb5eb6a9457Evgeniy Dushistov return fs32_to_cpu(sb, usb3->fs_un2.fs_44.fs_state); 521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic inline void 561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsufs_set_fs_state(struct super_block *sb, struct ufs_super_block_first *usb1, 571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct ufs_super_block_third *usb3, s32 value) 581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds switch (UFS_SB(sb)->s_flags & UFS_ST_MASK) { 60252e211e90ce56bf005cb533ad5a297c18c19407Mark Fortescue case UFS_ST_SUNOS: 61f81e8a43871f44f98dd14e83a83bf9ca0b3b46c5Roel Kluin if (fs32_to_cpu(sb, usb3->fs_postblformat) == UFS_42POSTBLFMT) { 62252e211e90ce56bf005cb533ad5a297c18c19407Mark Fortescue usb1->fs_u0.fs_sun.fs_state = cpu_to_fs32(sb, value); 63252e211e90ce56bf005cb533ad5a297c18c19407Mark Fortescue break; 64252e211e90ce56bf005cb533ad5a297c18c19407Mark Fortescue } 65252e211e90ce56bf005cb533ad5a297c18c19407Mark Fortescue /* Fall Through to UFS_ST_SUN */ 661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case UFS_ST_SUN: 67647b7e87b56f594daf648f44abfbeeb5eb6a9457Evgeniy Dushistov usb3->fs_un2.fs_sun.fs_state = cpu_to_fs32(sb, value); 681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case UFS_ST_SUNx86: 701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds usb1->fs_u1.fs_sunx86.fs_state = cpu_to_fs32(sb, value); 711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case UFS_ST_44BSD: 73647b7e87b56f594daf648f44abfbeeb5eb6a9457Evgeniy Dushistov usb3->fs_un2.fs_44.fs_state = cpu_to_fs32(sb, value); 741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic inline u32 791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsufs_get_fs_npsect(struct super_block *sb, struct ufs_super_block_first *usb1, 801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct ufs_super_block_third *usb3) 811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if ((UFS_SB(sb)->s_flags & UFS_ST_MASK) == UFS_ST_SUNx86) 83647b7e87b56f594daf648f44abfbeeb5eb6a9457Evgeniy Dushistov return fs32_to_cpu(sb, usb3->fs_un2.fs_sunx86.fs_npsect); 841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds else 851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return fs32_to_cpu(sb, usb1->fs_u1.fs_sun.fs_npsect); 861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic inline u64 891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsufs_get_fs_qbmask(struct super_block *sb, struct ufs_super_block_third *usb3) 901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds __fs64 tmp; 921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds switch (UFS_SB(sb)->s_flags & UFS_ST_MASK) { 94252e211e90ce56bf005cb533ad5a297c18c19407Mark Fortescue case UFS_ST_SUNOS: 951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case UFS_ST_SUN: 96647b7e87b56f594daf648f44abfbeeb5eb6a9457Evgeniy Dushistov ((__fs32 *)&tmp)[0] = usb3->fs_un2.fs_sun.fs_qbmask[0]; 97647b7e87b56f594daf648f44abfbeeb5eb6a9457Evgeniy Dushistov ((__fs32 *)&tmp)[1] = usb3->fs_un2.fs_sun.fs_qbmask[1]; 981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case UFS_ST_SUNx86: 100647b7e87b56f594daf648f44abfbeeb5eb6a9457Evgeniy Dushistov ((__fs32 *)&tmp)[0] = usb3->fs_un2.fs_sunx86.fs_qbmask[0]; 101647b7e87b56f594daf648f44abfbeeb5eb6a9457Evgeniy Dushistov ((__fs32 *)&tmp)[1] = usb3->fs_un2.fs_sunx86.fs_qbmask[1]; 1021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 1031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case UFS_ST_44BSD: 104647b7e87b56f594daf648f44abfbeeb5eb6a9457Evgeniy Dushistov ((__fs32 *)&tmp)[0] = usb3->fs_un2.fs_44.fs_qbmask[0]; 105647b7e87b56f594daf648f44abfbeeb5eb6a9457Evgeniy Dushistov ((__fs32 *)&tmp)[1] = usb3->fs_un2.fs_44.fs_qbmask[1]; 1061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 1071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 1081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return fs64_to_cpu(sb, tmp); 1101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 1111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic inline u64 1131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsufs_get_fs_qfmask(struct super_block *sb, struct ufs_super_block_third *usb3) 1141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 1151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds __fs64 tmp; 1161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds switch (UFS_SB(sb)->s_flags & UFS_ST_MASK) { 118252e211e90ce56bf005cb533ad5a297c18c19407Mark Fortescue case UFS_ST_SUNOS: 1191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case UFS_ST_SUN: 120647b7e87b56f594daf648f44abfbeeb5eb6a9457Evgeniy Dushistov ((__fs32 *)&tmp)[0] = usb3->fs_un2.fs_sun.fs_qfmask[0]; 121647b7e87b56f594daf648f44abfbeeb5eb6a9457Evgeniy Dushistov ((__fs32 *)&tmp)[1] = usb3->fs_un2.fs_sun.fs_qfmask[1]; 1221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 1231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case UFS_ST_SUNx86: 124647b7e87b56f594daf648f44abfbeeb5eb6a9457Evgeniy Dushistov ((__fs32 *)&tmp)[0] = usb3->fs_un2.fs_sunx86.fs_qfmask[0]; 125647b7e87b56f594daf648f44abfbeeb5eb6a9457Evgeniy Dushistov ((__fs32 *)&tmp)[1] = usb3->fs_un2.fs_sunx86.fs_qfmask[1]; 1261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 1271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case UFS_ST_44BSD: 128647b7e87b56f594daf648f44abfbeeb5eb6a9457Evgeniy Dushistov ((__fs32 *)&tmp)[0] = usb3->fs_un2.fs_44.fs_qfmask[0]; 129647b7e87b56f594daf648f44abfbeeb5eb6a9457Evgeniy Dushistov ((__fs32 *)&tmp)[1] = usb3->fs_un2.fs_44.fs_qfmask[1]; 1301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 1311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 1321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return fs64_to_cpu(sb, tmp); 1341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 1351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic inline u16 1371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsufs_get_de_namlen(struct super_block *sb, struct ufs_dir_entry *de) 1381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 1391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if ((UFS_SB(sb)->s_flags & UFS_DE_MASK) == UFS_DE_OLD) 1401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return fs16_to_cpu(sb, de->d_u.d_namlen); 1411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds else 1421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return de->d_u.d_44.d_namlen; /* XXX this seems wrong */ 1431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 1441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic inline void 1461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsufs_set_de_namlen(struct super_block *sb, struct ufs_dir_entry *de, u16 value) 1471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 1481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if ((UFS_SB(sb)->s_flags & UFS_DE_MASK) == UFS_DE_OLD) 1491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds de->d_u.d_namlen = cpu_to_fs16(sb, value); 1501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds else 1511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds de->d_u.d_44.d_namlen = value; /* XXX this seems wrong */ 1521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 1531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic inline void 1551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsufs_set_de_type(struct super_block *sb, struct ufs_dir_entry *de, int mode) 1561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 1571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if ((UFS_SB(sb)->s_flags & UFS_DE_MASK) != UFS_DE_44BSD) 1581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return; 1591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* 1611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * TODO turn this into a table lookup 1621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 1631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds switch (mode & S_IFMT) { 1641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case S_IFSOCK: 1651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds de->d_u.d_44.d_type = DT_SOCK; 1661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 1671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case S_IFLNK: 1681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds de->d_u.d_44.d_type = DT_LNK; 1691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 1701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case S_IFREG: 1711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds de->d_u.d_44.d_type = DT_REG; 1721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 1731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case S_IFBLK: 1741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds de->d_u.d_44.d_type = DT_BLK; 1751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 1761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case S_IFDIR: 1771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds de->d_u.d_44.d_type = DT_DIR; 1781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 1791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case S_IFCHR: 1801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds de->d_u.d_44.d_type = DT_CHR; 1811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 1821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case S_IFIFO: 1831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds de->d_u.d_44.d_type = DT_FIFO; 1841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 1851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds default: 1861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds de->d_u.d_44.d_type = DT_UNKNOWN; 1871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 1881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 1891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic inline u32 1911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsufs_get_inode_uid(struct super_block *sb, struct ufs_inode *inode) 1921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 1931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds switch (UFS_SB(sb)->s_flags & UFS_UID_MASK) { 1941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case UFS_UID_44BSD: 1951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return fs32_to_cpu(sb, inode->ui_u3.ui_44.ui_uid); 196252e211e90ce56bf005cb533ad5a297c18c19407Mark Fortescue case UFS_UID_EFT: 197252e211e90ce56bf005cb533ad5a297c18c19407Mark Fortescue if (inode->ui_u1.oldids.ui_suid == 0xFFFF) 198252e211e90ce56bf005cb533ad5a297c18c19407Mark Fortescue return fs32_to_cpu(sb, inode->ui_u3.ui_sun.ui_uid); 199252e211e90ce56bf005cb533ad5a297c18c19407Mark Fortescue /* Fall through */ 2001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds default: 2011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return fs16_to_cpu(sb, inode->ui_u1.oldids.ui_suid); 2021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 2031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 2041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic inline void 2061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsufs_set_inode_uid(struct super_block *sb, struct ufs_inode *inode, u32 value) 2071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 2081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds switch (UFS_SB(sb)->s_flags & UFS_UID_MASK) { 2091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case UFS_UID_44BSD: 2101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds inode->ui_u3.ui_44.ui_uid = cpu_to_fs32(sb, value); 211252e211e90ce56bf005cb533ad5a297c18c19407Mark Fortescue inode->ui_u1.oldids.ui_suid = cpu_to_fs16(sb, value); 212252e211e90ce56bf005cb533ad5a297c18c19407Mark Fortescue break; 213252e211e90ce56bf005cb533ad5a297c18c19407Mark Fortescue case UFS_UID_EFT: 214252e211e90ce56bf005cb533ad5a297c18c19407Mark Fortescue inode->ui_u3.ui_sun.ui_uid = cpu_to_fs32(sb, value); 215252e211e90ce56bf005cb533ad5a297c18c19407Mark Fortescue if (value > 0xFFFF) 216252e211e90ce56bf005cb533ad5a297c18c19407Mark Fortescue value = 0xFFFF; 217252e211e90ce56bf005cb533ad5a297c18c19407Mark Fortescue /* Fall through */ 218252e211e90ce56bf005cb533ad5a297c18c19407Mark Fortescue default: 219252e211e90ce56bf005cb533ad5a297c18c19407Mark Fortescue inode->ui_u1.oldids.ui_suid = cpu_to_fs16(sb, value); 2201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 2211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 2221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 2231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic inline u32 2251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsufs_get_inode_gid(struct super_block *sb, struct ufs_inode *inode) 2261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 2271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds switch (UFS_SB(sb)->s_flags & UFS_UID_MASK) { 2281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case UFS_UID_44BSD: 2291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return fs32_to_cpu(sb, inode->ui_u3.ui_44.ui_gid); 230252e211e90ce56bf005cb533ad5a297c18c19407Mark Fortescue case UFS_UID_EFT: 231252e211e90ce56bf005cb533ad5a297c18c19407Mark Fortescue if (inode->ui_u1.oldids.ui_suid == 0xFFFF) 232252e211e90ce56bf005cb533ad5a297c18c19407Mark Fortescue return fs32_to_cpu(sb, inode->ui_u3.ui_sun.ui_gid); 233252e211e90ce56bf005cb533ad5a297c18c19407Mark Fortescue /* Fall through */ 2341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds default: 2351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return fs16_to_cpu(sb, inode->ui_u1.oldids.ui_sgid); 2361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 2371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 2381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic inline void 2401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsufs_set_inode_gid(struct super_block *sb, struct ufs_inode *inode, u32 value) 2411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 2421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds switch (UFS_SB(sb)->s_flags & UFS_UID_MASK) { 2431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case UFS_UID_44BSD: 2441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds inode->ui_u3.ui_44.ui_gid = cpu_to_fs32(sb, value); 245252e211e90ce56bf005cb533ad5a297c18c19407Mark Fortescue inode->ui_u1.oldids.ui_sgid = cpu_to_fs16(sb, value); 246252e211e90ce56bf005cb533ad5a297c18c19407Mark Fortescue break; 247252e211e90ce56bf005cb533ad5a297c18c19407Mark Fortescue case UFS_UID_EFT: 248252e211e90ce56bf005cb533ad5a297c18c19407Mark Fortescue inode->ui_u3.ui_sun.ui_gid = cpu_to_fs32(sb, value); 249252e211e90ce56bf005cb533ad5a297c18c19407Mark Fortescue if (value > 0xFFFF) 250252e211e90ce56bf005cb533ad5a297c18c19407Mark Fortescue value = 0xFFFF; 251252e211e90ce56bf005cb533ad5a297c18c19407Mark Fortescue /* Fall through */ 252252e211e90ce56bf005cb533ad5a297c18c19407Mark Fortescue default: 253252e211e90ce56bf005cb533ad5a297c18c19407Mark Fortescue inode->ui_u1.oldids.ui_sgid = cpu_to_fs16(sb, value); 2541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 2551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 2561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 2571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsextern dev_t ufs_get_inode_dev(struct super_block *, struct ufs_inode_info *); 2591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsextern void ufs_set_inode_dev(struct super_block *, struct ufs_inode_info *, dev_t); 260f4e420dc423148fba637af1ab618fa8896dfb2d6Christoph Hellwigextern int ufs_prepare_chunk(struct page *page, loff_t pos, unsigned len); 2611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* 2631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * These functions manipulate ufs buffers 2641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 2651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define ubh_bread(sb,fragment,size) _ubh_bread_(uspi,sb,fragment,size) 2661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsextern struct ufs_buffer_head * _ubh_bread_(struct ufs_sb_private_info *, struct super_block *, u64 , u64); 2671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsextern struct ufs_buffer_head * ubh_bread_uspi(struct ufs_sb_private_info *, struct super_block *, u64, u64); 2681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsextern void ubh_brelse (struct ufs_buffer_head *); 2691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsextern void ubh_brelse_uspi (struct ufs_sb_private_info *); 2701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsextern void ubh_mark_buffer_dirty (struct ufs_buffer_head *); 2711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsextern void ubh_mark_buffer_uptodate (struct ufs_buffer_head *, int); 2729cb569d601e0b93e01c20a22872270ec663b75f6Christoph Hellwigextern void ubh_sync_block(struct ufs_buffer_head *); 2731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsextern void ubh_bforget (struct ufs_buffer_head *); 2741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsextern int ubh_buffer_dirty (struct ufs_buffer_head *); 2751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define ubh_ubhcpymem(mem,ubh,size) _ubh_ubhcpymem_(uspi,mem,ubh,size) 2761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsextern void _ubh_ubhcpymem_(struct ufs_sb_private_info *, unsigned char *, struct ufs_buffer_head *, unsigned); 2771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define ubh_memcpyubh(ubh,mem,size) _ubh_memcpyubh_(uspi,ubh,mem,size) 2781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsextern void _ubh_memcpyubh_(struct ufs_sb_private_info *, struct ufs_buffer_head *, unsigned char *, unsigned); 2791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 28010e5dce07e6f8f9cea1b54161a888bb099484f88Evgeniy Dushistov/* This functions works with cache pages*/ 28110e5dce07e6f8f9cea1b54161a888bb099484f88Evgeniy Dushistovextern struct page *ufs_get_locked_page(struct address_space *mapping, 28210e5dce07e6f8f9cea1b54161a888bb099484f88Evgeniy Dushistov pgoff_t index); 28310e5dce07e6f8f9cea1b54161a888bb099484f88Evgeniy Dushistovstatic inline void ufs_put_locked_page(struct page *page) 28410e5dce07e6f8f9cea1b54161a888bb099484f88Evgeniy Dushistov{ 28510e5dce07e6f8f9cea1b54161a888bb099484f88Evgeniy Dushistov unlock_page(page); 28610e5dce07e6f8f9cea1b54161a888bb099484f88Evgeniy Dushistov page_cache_release(page); 28710e5dce07e6f8f9cea1b54161a888bb099484f88Evgeniy Dushistov} 2881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* 2917b4ee73e28052e53aac2fef1c91029666d8b2d70Evgeniy * macros and inline function to get important structures from ufs_sb_private_info 2921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 2931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2947b4ee73e28052e53aac2fef1c91029666d8b2d70Evgeniystatic inline void *get_usb_offset(struct ufs_sb_private_info *uspi, 2957b4ee73e28052e53aac2fef1c91029666d8b2d70Evgeniy unsigned int offset) 2967b4ee73e28052e53aac2fef1c91029666d8b2d70Evgeniy{ 2977b4ee73e28052e53aac2fef1c91029666d8b2d70Evgeniy unsigned int index; 2987b4ee73e28052e53aac2fef1c91029666d8b2d70Evgeniy 2997b4ee73e28052e53aac2fef1c91029666d8b2d70Evgeniy index = offset >> uspi->s_fshift; 3007b4ee73e28052e53aac2fef1c91029666d8b2d70Evgeniy offset &= ~uspi->s_fmask; 3017b4ee73e28052e53aac2fef1c91029666d8b2d70Evgeniy return uspi->s_ubh.bh[index]->b_data + offset; 3027b4ee73e28052e53aac2fef1c91029666d8b2d70Evgeniy} 3037b4ee73e28052e53aac2fef1c91029666d8b2d70Evgeniy 3047b4ee73e28052e53aac2fef1c91029666d8b2d70Evgeniy#define ubh_get_usb_first(uspi) \ 3057b4ee73e28052e53aac2fef1c91029666d8b2d70Evgeniy ((struct ufs_super_block_first *)get_usb_offset((uspi), 0)) 3067b4ee73e28052e53aac2fef1c91029666d8b2d70Evgeniy 3077b4ee73e28052e53aac2fef1c91029666d8b2d70Evgeniy#define ubh_get_usb_second(uspi) \ 3087b4ee73e28052e53aac2fef1c91029666d8b2d70Evgeniy ((struct ufs_super_block_second *)get_usb_offset((uspi), UFS_SECTOR_SIZE)) 3097b4ee73e28052e53aac2fef1c91029666d8b2d70Evgeniy 3107b4ee73e28052e53aac2fef1c91029666d8b2d70Evgeniy#define ubh_get_usb_third(uspi) \ 3117b4ee73e28052e53aac2fef1c91029666d8b2d70Evgeniy ((struct ufs_super_block_third *)get_usb_offset((uspi), 2*UFS_SECTOR_SIZE)) 3121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define ubh_get_ucg(ubh) \ 3151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ((struct ufs_cylinder_group *)((ubh)->bh[0]->b_data)) 3161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* 3191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Extract byte from ufs_buffer_head 3201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Extract the bits for a block from a map inside ufs_buffer_head 3211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 3221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define ubh_get_addr8(ubh,begin) \ 3231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ((u8*)(ubh)->bh[(begin) >> uspi->s_fshift]->b_data + \ 3241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ((begin) & ~uspi->s_fmask)) 3251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define ubh_get_addr16(ubh,begin) \ 3271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds (((__fs16*)((ubh)->bh[(begin) >> (uspi->s_fshift-1)]->b_data)) + \ 32871a3d1b4f7633835048f96a4ba79c8c87f03df4bMariusz Kozlowski ((begin) & ((uspi->fsize>>1) - 1))) 3291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define ubh_get_addr32(ubh,begin) \ 3311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds (((__fs32*)((ubh)->bh[(begin) >> (uspi->s_fshift-2)]->b_data)) + \ 3321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ((begin) & ((uspi->s_fsize>>2) - 1))) 3331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 33454fb996ac15c4014fa4d6b0ec8e42da134204897Evgeniy Dushistov#define ubh_get_addr64(ubh,begin) \ 33554fb996ac15c4014fa4d6b0ec8e42da134204897Evgeniy Dushistov (((__fs64*)((ubh)->bh[(begin) >> (uspi->s_fshift-3)]->b_data)) + \ 33654fb996ac15c4014fa4d6b0ec8e42da134204897Evgeniy Dushistov ((begin) & ((uspi->s_fsize>>3) - 1))) 33754fb996ac15c4014fa4d6b0ec8e42da134204897Evgeniy Dushistov 3381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define ubh_get_addr ubh_get_addr8 3391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 34054fb996ac15c4014fa4d6b0ec8e42da134204897Evgeniy Dushistovstatic inline void *ubh_get_data_ptr(struct ufs_sb_private_info *uspi, 34154fb996ac15c4014fa4d6b0ec8e42da134204897Evgeniy Dushistov struct ufs_buffer_head *ubh, 34254fb996ac15c4014fa4d6b0ec8e42da134204897Evgeniy Dushistov u64 blk) 34354fb996ac15c4014fa4d6b0ec8e42da134204897Evgeniy Dushistov{ 34454fb996ac15c4014fa4d6b0ec8e42da134204897Evgeniy Dushistov if (uspi->fs_magic == UFS2_MAGIC) 34554fb996ac15c4014fa4d6b0ec8e42da134204897Evgeniy Dushistov return ubh_get_addr64(ubh, blk); 34654fb996ac15c4014fa4d6b0ec8e42da134204897Evgeniy Dushistov else 34754fb996ac15c4014fa4d6b0ec8e42da134204897Evgeniy Dushistov return ubh_get_addr32(ubh, blk); 34854fb996ac15c4014fa4d6b0ec8e42da134204897Evgeniy Dushistov} 34954fb996ac15c4014fa4d6b0ec8e42da134204897Evgeniy Dushistov 3501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define ubh_blkmap(ubh,begin,bit) \ 3511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ((*ubh_get_addr(ubh, (begin) + ((bit) >> 3)) >> ((bit) & 7)) & (0xff >> (UFS_MAXFRAG - uspi->s_fpb))) 3521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* 3541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Determine the number of available frags given a 3551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * percentage to hold in reserve. 3561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 357ee3ffd6c126323693b3b32a71a1f1acfce30bd66Evgeniy Dushistovstatic inline u64 358ee3ffd6c126323693b3b32a71a1f1acfce30bd66Evgeniy Dushistovufs_freespace(struct ufs_sb_private_info *uspi, int percentreserved) 359ee3ffd6c126323693b3b32a71a1f1acfce30bd66Evgeniy Dushistov{ 360ee3ffd6c126323693b3b32a71a1f1acfce30bd66Evgeniy Dushistov return ufs_blkstofrags(uspi->cs_total.cs_nbfree) + 361ee3ffd6c126323693b3b32a71a1f1acfce30bd66Evgeniy Dushistov uspi->cs_total.cs_nffree - 362ee3ffd6c126323693b3b32a71a1f1acfce30bd66Evgeniy Dushistov (uspi->s_dsize * (percentreserved) / 100); 363ee3ffd6c126323693b3b32a71a1f1acfce30bd66Evgeniy Dushistov} 3641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* 3661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Macros to access cylinder group array structures 3671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 3681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define ubh_cg_blktot(ucpi,cylno) \ 3699695ef16ed4e00b59303f39f9a4a422a2c6a3b89Evgeniy Dushistov (*((__fs32*)ubh_get_addr(UCPI_UBH(ucpi), (ucpi)->c_btotoff + ((cylno) << 2)))) 3701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define ubh_cg_blks(ucpi,cylno,rpos) \ 3729695ef16ed4e00b59303f39f9a4a422a2c6a3b89Evgeniy Dushistov (*((__fs16*)ubh_get_addr(UCPI_UBH(ucpi), \ 3731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds (ucpi)->c_boff + (((cylno) * uspi->s_nrpos + (rpos)) << 1 )))) 3741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* 3761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Bitmap operations 3771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * These functions work like classical bitmap operations. 3781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * The difference is that we don't have the whole bitmap 3791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * in one contiguous chunk of memory, but in several buffers. 3801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * The parameters of each function are super_block, ufs_buffer_head and 3811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * position of the beginning of the bitmap. 3821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 3831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define ubh_setbit(ubh,begin,bit) \ 3841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds (*ubh_get_addr(ubh, (begin) + ((bit) >> 3)) |= (1 << ((bit) & 7))) 3851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define ubh_clrbit(ubh,begin,bit) \ 3871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds (*ubh_get_addr (ubh, (begin) + ((bit) >> 3)) &= ~(1 << ((bit) & 7))) 3881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define ubh_isset(ubh,begin,bit) \ 3901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds (*ubh_get_addr (ubh, (begin) + ((bit) >> 3)) & (1 << ((bit) & 7))) 3911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define ubh_isclr(ubh,begin,bit) (!ubh_isset(ubh,begin,bit)) 3931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define ubh_find_first_zero_bit(ubh,begin,size) _ubh_find_next_zero_bit_(uspi,ubh,begin,size,0) 3951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define ubh_find_next_zero_bit(ubh,begin,size,offset) _ubh_find_next_zero_bit_(uspi,ubh,begin,size,offset) 3971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic inline unsigned _ubh_find_next_zero_bit_( 3981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct ufs_sb_private_info * uspi, struct ufs_buffer_head * ubh, 3991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds unsigned begin, unsigned size, unsigned offset) 4001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 4011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds unsigned base, count, pos; 4021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 4031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds size -= offset; 4041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds begin <<= 3; 4051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds offset += begin; 4061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds base = offset >> uspi->s_bpfshift; 4071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds offset &= uspi->s_bpfmask; 4081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds for (;;) { 4091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds count = min_t(unsigned int, size + offset, uspi->s_bpf); 4101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds size -= count - offset; 4113cdc7125c364b2baad8aba69c058b26d3dca5f52Akinobu Mita pos = find_next_zero_bit_le(ubh->bh[base]->b_data, count, offset); 4121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (pos < count || !size) 4131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 4141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds base++; 4151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds offset = 0; 4161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 4171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return (base << uspi->s_bpfshift) + pos - begin; 4181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 4191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 4201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic inline unsigned find_last_zero_bit (unsigned char * bitmap, 4211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds unsigned size, unsigned offset) 4221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 4231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds unsigned bit, i; 4241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds unsigned char * mapp; 4251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds unsigned char map; 4261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 4271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds mapp = bitmap + (size >> 3); 4281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds map = *mapp--; 4291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds bit = 1 << (size & 7); 4301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds for (i = size; i > offset; i--) { 4311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if ((map & bit) == 0) 4321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 4331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if ((i & 7) != 0) { 4341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds bit >>= 1; 4351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } else { 4361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds map = *mapp--; 4371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds bit = 1 << 7; 4381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 4391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 4401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return i; 4411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 4421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 4431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define ubh_find_last_zero_bit(ubh,begin,size,offset) _ubh_find_last_zero_bit_(uspi,ubh,begin,size,offset) 4441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic inline unsigned _ubh_find_last_zero_bit_( 4451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct ufs_sb_private_info * uspi, struct ufs_buffer_head * ubh, 4461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds unsigned begin, unsigned start, unsigned end) 4471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 4481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds unsigned base, count, pos, size; 4491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 4501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds size = start - end; 4511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds begin <<= 3; 4521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds start += begin; 4531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds base = start >> uspi->s_bpfshift; 4541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds start &= uspi->s_bpfmask; 4551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds for (;;) { 4561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds count = min_t(unsigned int, 4571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds size + (uspi->s_bpf - start), uspi->s_bpf) 4581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds - (uspi->s_bpf - start); 4591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds size -= count; 4601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds pos = find_last_zero_bit (ubh->bh[base]->b_data, 4611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds start, start - count); 4621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (pos > start - count || !size) 4631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 4641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds base--; 4651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds start = uspi->s_bpf; 4661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 4671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return (base << uspi->s_bpfshift) + pos - begin; 4681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 4691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 4701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define ubh_isblockclear(ubh,begin,block) (!_ubh_isblockset_(uspi,ubh,begin,block)) 4711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 4721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define ubh_isblockset(ubh,begin,block) _ubh_isblockset_(uspi,ubh,begin,block) 4731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic inline int _ubh_isblockset_(struct ufs_sb_private_info * uspi, 4741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct ufs_buffer_head * ubh, unsigned begin, unsigned block) 4751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 4761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds switch (uspi->s_fpb) { 4771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case 8: 4781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return (*ubh_get_addr (ubh, begin + block) == 0xff); 4791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case 4: 4801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return (*ubh_get_addr (ubh, begin + (block >> 1)) == (0x0f << ((block & 0x01) << 2))); 4811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case 2: 4821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return (*ubh_get_addr (ubh, begin + (block >> 2)) == (0x03 << ((block & 0x03) << 1))); 4831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case 1: 4841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return (*ubh_get_addr (ubh, begin + (block >> 3)) == (0x01 << (block & 0x07))); 4851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 4861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return 0; 4871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 4881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 4891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define ubh_clrblock(ubh,begin,block) _ubh_clrblock_(uspi,ubh,begin,block) 4901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic inline void _ubh_clrblock_(struct ufs_sb_private_info * uspi, 4911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct ufs_buffer_head * ubh, unsigned begin, unsigned block) 4921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 4931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds switch (uspi->s_fpb) { 4941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case 8: 4951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *ubh_get_addr (ubh, begin + block) = 0x00; 4961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return; 4971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case 4: 4981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *ubh_get_addr (ubh, begin + (block >> 1)) &= ~(0x0f << ((block & 0x01) << 2)); 4991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return; 5001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case 2: 5011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *ubh_get_addr (ubh, begin + (block >> 2)) &= ~(0x03 << ((block & 0x03) << 1)); 5021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return; 5031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case 1: 5041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *ubh_get_addr (ubh, begin + (block >> 3)) &= ~(0x01 << ((block & 0x07))); 5051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return; 5061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 5071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 5081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 5091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define ubh_setblock(ubh,begin,block) _ubh_setblock_(uspi,ubh,begin,block) 5101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic inline void _ubh_setblock_(struct ufs_sb_private_info * uspi, 5111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct ufs_buffer_head * ubh, unsigned begin, unsigned block) 5121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 5131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds switch (uspi->s_fpb) { 5141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case 8: 5151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *ubh_get_addr(ubh, begin + block) = 0xff; 5161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return; 5171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case 4: 5181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *ubh_get_addr(ubh, begin + (block >> 1)) |= (0x0f << ((block & 0x01) << 2)); 5191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return; 5201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case 2: 5211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *ubh_get_addr(ubh, begin + (block >> 2)) |= (0x03 << ((block & 0x03) << 1)); 5221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return; 5231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case 1: 5241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *ubh_get_addr(ubh, begin + (block >> 3)) |= (0x01 << ((block & 0x07))); 5251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return; 5261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 5271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 5281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 5291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic inline void ufs_fragacct (struct super_block * sb, unsigned blockmap, 5301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds __fs32 * fraglist, int cnt) 5311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 5321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct ufs_sb_private_info * uspi; 5331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds unsigned fragsize, pos; 5341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 5351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds uspi = UFS_SB(sb)->s_uspi; 5361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 5371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds fragsize = 0; 5381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds for (pos = 0; pos < uspi->s_fpb; pos++) { 5391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (blockmap & (1 << pos)) { 5401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds fragsize++; 5411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 5421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds else if (fragsize > 0) { 5431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds fs32_add(sb, &fraglist[fragsize], cnt); 5441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds fragsize = 0; 5451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 5461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 5471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (fragsize > 0 && fragsize < uspi->s_fpb) 5481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds fs32_add(sb, &fraglist[fragsize], cnt); 5491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 55054fb996ac15c4014fa4d6b0ec8e42da134204897Evgeniy Dushistov 55154fb996ac15c4014fa4d6b0ec8e42da134204897Evgeniy Dushistovstatic inline void *ufs_get_direct_data_ptr(struct ufs_sb_private_info *uspi, 55254fb996ac15c4014fa4d6b0ec8e42da134204897Evgeniy Dushistov struct ufs_inode_info *ufsi, 55354fb996ac15c4014fa4d6b0ec8e42da134204897Evgeniy Dushistov unsigned blk) 55454fb996ac15c4014fa4d6b0ec8e42da134204897Evgeniy Dushistov{ 55554fb996ac15c4014fa4d6b0ec8e42da134204897Evgeniy Dushistov BUG_ON(blk > UFS_TIND_BLOCK); 55654fb996ac15c4014fa4d6b0ec8e42da134204897Evgeniy Dushistov return uspi->fs_magic == UFS2_MAGIC ? 55754fb996ac15c4014fa4d6b0ec8e42da134204897Evgeniy Dushistov (void *)&ufsi->i_u1.u2_i_data[blk] : 55854fb996ac15c4014fa4d6b0ec8e42da134204897Evgeniy Dushistov (void *)&ufsi->i_u1.i_data[blk]; 55954fb996ac15c4014fa4d6b0ec8e42da134204897Evgeniy Dushistov} 56054fb996ac15c4014fa4d6b0ec8e42da134204897Evgeniy Dushistov 56154fb996ac15c4014fa4d6b0ec8e42da134204897Evgeniy Dushistovstatic inline u64 ufs_data_ptr_to_cpu(struct super_block *sb, void *p) 56254fb996ac15c4014fa4d6b0ec8e42da134204897Evgeniy Dushistov{ 56354fb996ac15c4014fa4d6b0ec8e42da134204897Evgeniy Dushistov return UFS_SB(sb)->s_uspi->fs_magic == UFS2_MAGIC ? 56454fb996ac15c4014fa4d6b0ec8e42da134204897Evgeniy Dushistov fs64_to_cpu(sb, *(__fs64 *)p) : 56554fb996ac15c4014fa4d6b0ec8e42da134204897Evgeniy Dushistov fs32_to_cpu(sb, *(__fs32 *)p); 56654fb996ac15c4014fa4d6b0ec8e42da134204897Evgeniy Dushistov} 56754fb996ac15c4014fa4d6b0ec8e42da134204897Evgeniy Dushistov 56854fb996ac15c4014fa4d6b0ec8e42da134204897Evgeniy Dushistovstatic inline void ufs_cpu_to_data_ptr(struct super_block *sb, void *p, u64 val) 56954fb996ac15c4014fa4d6b0ec8e42da134204897Evgeniy Dushistov{ 57054fb996ac15c4014fa4d6b0ec8e42da134204897Evgeniy Dushistov if (UFS_SB(sb)->s_uspi->fs_magic == UFS2_MAGIC) 57154fb996ac15c4014fa4d6b0ec8e42da134204897Evgeniy Dushistov *(__fs64 *)p = cpu_to_fs64(sb, val); 57254fb996ac15c4014fa4d6b0ec8e42da134204897Evgeniy Dushistov else 57354fb996ac15c4014fa4d6b0ec8e42da134204897Evgeniy Dushistov *(__fs32 *)p = cpu_to_fs32(sb, val); 57454fb996ac15c4014fa4d6b0ec8e42da134204897Evgeniy Dushistov} 57554fb996ac15c4014fa4d6b0ec8e42da134204897Evgeniy Dushistov 57654fb996ac15c4014fa4d6b0ec8e42da134204897Evgeniy Dushistovstatic inline void ufs_data_ptr_clear(struct ufs_sb_private_info *uspi, 57754fb996ac15c4014fa4d6b0ec8e42da134204897Evgeniy Dushistov void *p) 57854fb996ac15c4014fa4d6b0ec8e42da134204897Evgeniy Dushistov{ 57954fb996ac15c4014fa4d6b0ec8e42da134204897Evgeniy Dushistov if (uspi->fs_magic == UFS2_MAGIC) 58054fb996ac15c4014fa4d6b0ec8e42da134204897Evgeniy Dushistov *(__fs64 *)p = 0; 58154fb996ac15c4014fa4d6b0ec8e42da134204897Evgeniy Dushistov else 58254fb996ac15c4014fa4d6b0ec8e42da134204897Evgeniy Dushistov *(__fs32 *)p = 0; 58354fb996ac15c4014fa4d6b0ec8e42da134204897Evgeniy Dushistov} 58454fb996ac15c4014fa4d6b0ec8e42da134204897Evgeniy Dushistov 58554fb996ac15c4014fa4d6b0ec8e42da134204897Evgeniy Dushistovstatic inline int ufs_is_data_ptr_zero(struct ufs_sb_private_info *uspi, 58654fb996ac15c4014fa4d6b0ec8e42da134204897Evgeniy Dushistov void *p) 58754fb996ac15c4014fa4d6b0ec8e42da134204897Evgeniy Dushistov{ 58854fb996ac15c4014fa4d6b0ec8e42da134204897Evgeniy Dushistov if (uspi->fs_magic == UFS2_MAGIC) 58954fb996ac15c4014fa4d6b0ec8e42da134204897Evgeniy Dushistov return *(__fs64 *)p == 0; 59054fb996ac15c4014fa4d6b0ec8e42da134204897Evgeniy Dushistov else 59154fb996ac15c4014fa4d6b0ec8e42da134204897Evgeniy Dushistov return *(__fs32 *)p == 0; 59254fb996ac15c4014fa4d6b0ec8e42da134204897Evgeniy Dushistov} 593