* [PATCH 0/3] fs/ntfs3: Fixes for big endian systems @ 2021-12-07 10:24 Thomas Kühnel 2021-12-07 10:24 ` [PATCH 1/3] fs/ntfs3: fix endian conversion in ni_fname_name Thomas Kühnel ` (3 more replies) 0 siblings, 4 replies; 8+ messages in thread From: Thomas Kühnel @ 2021-12-07 10:24 UTC (permalink / raw) To: Konstantin Komarov; +Cc: ntfs3, linux-kernel, Thomas Kühnel I tried running the NTFS3 driver on a MIPS big endian system and noticed various errors when it tried to access bitmaps structures that are stored as little endian on disk. These patches were mainly tested in a qemu mips environment. I'm open for suggestions how to better implement the second patch "add functions to modify LE bitmaps". It adds copies of two functions from lib/bitmap.c but modified to work with little endian bitmaps. Other filesystems seem to have similar functions defined locally like le_bitmap_set in btrfs or ext4_set_bits in ext4 but no global implementation exists. Thomas Kühnel (3): fs/ntfs3: fix endian conversion in ni_fname_name fs/ntfs3: add functions to modify LE bitmaps fs/ntfs3: use _le variants of bitops functions fs/ntfs3/bitmap.c | 56 +++++++++++++++++++++++++++++++++++++++------- fs/ntfs3/frecord.c | 4 +++- fs/ntfs3/fslog.c | 4 ++-- fs/ntfs3/fsntfs.c | 8 +++---- fs/ntfs3/index.c | 14 ++++++------ fs/ntfs3/ntfs_fs.h | 3 +++ 6 files changed, 67 insertions(+), 22 deletions(-) base-commit: 0fcfb00b28c0b7884635dacf38e46d60bf3d4eb1 -- 2.25.1 ^ permalink raw reply [flat|nested] 8+ messages in thread
* [PATCH 1/3] fs/ntfs3: fix endian conversion in ni_fname_name 2021-12-07 10:24 [PATCH 0/3] fs/ntfs3: Fixes for big endian systems Thomas Kühnel @ 2021-12-07 10:24 ` Thomas Kühnel 2021-12-07 16:00 ` kernel test robot 2021-12-07 10:24 ` [PATCH 2/3] fs/ntfs3: add functions to modify LE bitmaps Thomas Kühnel ` (2 subsequent siblings) 3 siblings, 1 reply; 8+ messages in thread From: Thomas Kühnel @ 2021-12-07 10:24 UTC (permalink / raw) To: Konstantin Komarov Cc: ntfs3, linux-kernel, Thomas Kühnel, Nicolas Schier ni_fname_name called ntfs_cmp_names_cpu which assumes that the first string is in CPU byte order and the second one in little endian. In this case both strings are little endian so ntfs_cmp_names is the correct function to call. Signed-off-by: Thomas Kühnel <thomas.kuehnel@avm.de> Reviewed-by: Nicolas Schier <n.schier@avm.de> --- fs/ntfs3/frecord.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/fs/ntfs3/frecord.c b/fs/ntfs3/frecord.c index 6f47a9c17f89..f3afdc91af76 100644 --- a/fs/ntfs3/frecord.c +++ b/fs/ntfs3/frecord.c @@ -1588,6 +1588,7 @@ struct ATTR_FILE_NAME *ni_fname_name(struct ntfs_inode *ni, { struct ATTRIB *attr = NULL; struct ATTR_FILE_NAME *fname; + struct le_str *fns; *le = NULL; @@ -1610,7 +1611,8 @@ struct ATTR_FILE_NAME *ni_fname_name(struct ntfs_inode *ni, if (uni->len != fname->name_len) goto next; - if (ntfs_cmp_names_cpu(uni, (struct le_str *)&fname->name_len, NULL, + fns = (struct le_str *)&fname->name_len; + if (ntfs_cmp_names(uni->name, uni->len, fns->name, fns->len, NULL, false)) goto next; -- 2.25.1 ^ permalink raw reply related [flat|nested] 8+ messages in thread
* Re: [PATCH 1/3] fs/ntfs3: fix endian conversion in ni_fname_name 2021-12-07 10:24 ` [PATCH 1/3] fs/ntfs3: fix endian conversion in ni_fname_name Thomas Kühnel @ 2021-12-07 16:00 ` kernel test robot 2021-12-09 10:50 ` Thomas Kühnel 0 siblings, 1 reply; 8+ messages in thread From: kernel test robot @ 2021-12-07 16:00 UTC (permalink / raw) To: Thomas Kühnel, Konstantin Komarov Cc: kbuild-all, ntfs3, linux-kernel, Thomas Kühnel, Nicolas Schier Hi "Thomas, Thank you for the patch! Perhaps something to improve: [auto build test WARNING on 0fcfb00b28c0b7884635dacf38e46d60bf3d4eb1] url: https://github.com/0day-ci/linux/commits/Thomas-K-hnel/fs-ntfs3-Fixes-for-big-endian-systems/20211207-184206 base: 0fcfb00b28c0b7884635dacf38e46d60bf3d4eb1 config: arm64-randconfig-s031-20211207 (https://download.01.org/0day-ci/archive/20211207/202112072356.fmLjngs7-lkp@intel.com/config) compiler: aarch64-linux-gcc (GCC) 11.2.0 reproduce: wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross chmod +x ~/bin/make.cross # apt-get install sparse # sparse version: v0.6.4-dirty # https://github.com/0day-ci/linux/commit/d2fb837ced1828c5a57feac3690d3cc8a36b2fdc git remote add linux-review https://github.com/0day-ci/linux git fetch --no-tags linux-review Thomas-K-hnel/fs-ntfs3-Fixes-for-big-endian-systems/20211207-184206 git checkout d2fb837ced1828c5a57feac3690d3cc8a36b2fdc # save the config file to linux build tree mkdir build_dir COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-11.2.0 make.cross C=1 CF='-fdiagnostic-prefix -D__CHECK_ENDIAN__' O=build_dir ARCH=arm64 SHELL=/bin/bash fs/ntfs3/ If you fix the issue, kindly add following tag as appropriate Reported-by: kernel test robot <lkp@intel.com> sparse warnings: (new ones prefixed by >>) >> fs/ntfs3/frecord.c:1615:28: sparse: sparse: incorrect type in argument 1 (different base types) @@ expected restricted __le16 const [usertype] *s1 @@ got unsigned short const * @@ fs/ntfs3/frecord.c:1615:28: sparse: expected restricted __le16 const [usertype] *s1 fs/ntfs3/frecord.c:1615:28: sparse: got unsigned short const * vim +1615 fs/ntfs3/frecord.c 1578 1579 /* ni_fname_name 1580 * 1581 * Return: File name attribute by its value. 1582 */ 1583 struct ATTR_FILE_NAME *ni_fname_name(struct ntfs_inode *ni, 1584 const struct cpu_str *uni, 1585 const struct MFT_REF *home_dir, 1586 struct mft_inode **mi, 1587 struct ATTR_LIST_ENTRY **le) 1588 { 1589 struct ATTRIB *attr = NULL; 1590 struct ATTR_FILE_NAME *fname; 1591 struct le_str *fns; 1592 1593 *le = NULL; 1594 1595 /* Enumerate all names. */ 1596 next: 1597 attr = ni_find_attr(ni, attr, le, ATTR_NAME, NULL, 0, NULL, mi); 1598 if (!attr) 1599 return NULL; 1600 1601 fname = resident_data_ex(attr, SIZEOF_ATTRIBUTE_FILENAME); 1602 if (!fname) 1603 goto next; 1604 1605 if (home_dir && memcmp(home_dir, &fname->home, sizeof(*home_dir))) 1606 goto next; 1607 1608 if (!uni) 1609 goto next; 1610 1611 if (uni->len != fname->name_len) 1612 goto next; 1613 1614 fns = (struct le_str *)&fname->name_len; > 1615 if (ntfs_cmp_names(uni->name, uni->len, fns->name, fns->len, NULL, 1616 false)) 1617 goto next; 1618 1619 return fname; 1620 } 1621 --- 0-DAY CI Kernel Test Service, Intel Corporation https://lists.01.org/hyperkitty/list/kbuild-all@lists.01.org ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH 1/3] fs/ntfs3: fix endian conversion in ni_fname_name 2021-12-07 16:00 ` kernel test robot @ 2021-12-09 10:50 ` Thomas Kühnel 0 siblings, 0 replies; 8+ messages in thread From: Thomas Kühnel @ 2021-12-09 10:50 UTC (permalink / raw) To: kernel test robot, Konstantin Komarov Cc: kbuild-all, ntfs3, linux-kernel, Nicolas Schier, Thomas Kühnel On 07.12.21 17:00, kernel test robot wrote: > Hi "Thomas, > > Thank you for the patch! Perhaps something to improve: > > [auto build test WARNING on 0fcfb00b28c0b7884635dacf38e46d60bf3d4eb1] > > url: https://github.com/0day-ci/linux/commits/Thomas-K-hnel/fs-ntfs3-Fixes-for-big-endian-systems/20211207-184206 > base: 0fcfb00b28c0b7884635dacf38e46d60bf3d4eb1 > config: arm64-randconfig-s031-20211207 (https://download.01.org/0day-ci/archive/20211207/202112072356.fmLjngs7-lkp@intel.com/config) > compiler: aarch64-linux-gcc (GCC) 11.2.0 > reproduce: > wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross > chmod +x ~/bin/make.cross > # apt-get install sparse > # sparse version: v0.6.4-dirty > # https://github.com/0day-ci/linux/commit/d2fb837ced1828c5a57feac3690d3cc8a36b2fdc > git remote add linux-review https://github.com/0day-ci/linux > git fetch --no-tags linux-review Thomas-K-hnel/fs-ntfs3-Fixes-for-big-endian-systems/20211207-184206 > git checkout d2fb837ced1828c5a57feac3690d3cc8a36b2fdc > # save the config file to linux build tree > mkdir build_dir > COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-11.2.0 make.cross C=1 CF='-fdiagnostic-prefix -D__CHECK_ENDIAN__' O=build_dir ARCH=arm64 SHELL=/bin/bash fs/ntfs3/ > > If you fix the issue, kindly add following tag as appropriate > Reported-by: kernel test robot <lkp@intel.com> > > > sparse warnings: (new ones prefixed by >>) >>> fs/ntfs3/frecord.c:1615:28: sparse: sparse: incorrect type in argument 1 (different base types) @@ expected restricted __le16 const [usertype] *s1 @@ got unsigned short const * @@ > fs/ntfs3/frecord.c:1615:28: sparse: expected restricted __le16 const [usertype] *s1 > fs/ntfs3/frecord.c:1615:28: sparse: got unsigned short const * > > vim +1615 fs/ntfs3/frecord.c > > 1578 > 1579 /* ni_fname_name > 1580 * > 1581 * Return: File name attribute by its value. > 1582 */ > 1583 struct ATTR_FILE_NAME *ni_fname_name(struct ntfs_inode *ni, > 1584 const struct cpu_str *uni, Changing the type of uni to struct le_str * should fix the warning. I'll change this in the next version of this patch. > 1585 const struct MFT_REF *home_dir, > 1586 struct mft_inode **mi, > 1587 struct ATTR_LIST_ENTRY **le) > 1588 { > 1589 struct ATTRIB *attr = NULL; > 1590 struct ATTR_FILE_NAME *fname; > 1591 struct le_str *fns; > 1592 > 1593 *le = NULL; > 1594 > 1595 /* Enumerate all names. */ > 1596 next: > 1597 attr = ni_find_attr(ni, attr, le, ATTR_NAME, NULL, 0, NULL, mi); > 1598 if (!attr) > 1599 return NULL; > 1600 > 1601 fname = resident_data_ex(attr, SIZEOF_ATTRIBUTE_FILENAME); > 1602 if (!fname) > 1603 goto next; > 1604 > 1605 if (home_dir && memcmp(home_dir, &fname->home, sizeof(*home_dir))) > 1606 goto next; > 1607 > 1608 if (!uni) > 1609 goto next; > 1610 > 1611 if (uni->len != fname->name_len) > 1612 goto next; > 1613 > 1614 fns = (struct le_str *)&fname->name_len; >> 1615 if (ntfs_cmp_names(uni->name, uni->len, fns->name, fns->len, NULL, > 1616 false)) > 1617 goto next; > 1618 > 1619 return fname; > 1620 } > 1621 > > --- > 0-DAY CI Kernel Test Service, Intel Corporation > https://lists.01.org/hyperkitty/list/kbuild-all@lists.01.org > ^ permalink raw reply [flat|nested] 8+ messages in thread
* [PATCH 2/3] fs/ntfs3: add functions to modify LE bitmaps 2021-12-07 10:24 [PATCH 0/3] fs/ntfs3: Fixes for big endian systems Thomas Kühnel 2021-12-07 10:24 ` [PATCH 1/3] fs/ntfs3: fix endian conversion in ni_fname_name Thomas Kühnel @ 2021-12-07 10:24 ` Thomas Kühnel 2021-12-07 17:31 ` kernel test robot 2021-12-07 10:24 ` [PATCH 3/3] fs/ntfs3: use _le variants of bitops functions Thomas Kühnel 2022-12-30 12:07 ` [PATCH 0/3] fs/ntfs3: Fixes for big endian systems Konstantin Komarov 3 siblings, 1 reply; 8+ messages in thread From: Thomas Kühnel @ 2021-12-07 10:24 UTC (permalink / raw) To: Konstantin Komarov Cc: ntfs3, linux-kernel, Thomas Kühnel, Nicolas Schier __bitmap_set/__bitmap_clear only works with bitmaps in CPU order. Define a variant of these functions in ntfs3 to handle modifying bitmaps read from the filesystem. Signed-off-by: Thomas Kühnel <thomas.kuehnel@avm.de> Reviewed-by: Nicolas Schier <n.schier@avm.de> --- fs/ntfs3/bitmap.c | 46 +++++++++++++++++++++++++++++++++++++++++++--- fs/ntfs3/fslog.c | 4 ++-- fs/ntfs3/ntfs_fs.h | 3 +++ 3 files changed, 48 insertions(+), 5 deletions(-) diff --git a/fs/ntfs3/bitmap.c b/fs/ntfs3/bitmap.c index aa184407520f..b61cf533b030 100644 --- a/fs/ntfs3/bitmap.c +++ b/fs/ntfs3/bitmap.c @@ -741,7 +741,7 @@ int wnd_set_free(struct wnd_bitmap *wnd, size_t bit, size_t bits) lock_buffer(bh); - __bitmap_clear(buf, wbit, op); + ntfs_bitmap_clear_le(buf, wbit, op); wnd->free_bits[iw] += op; @@ -793,7 +793,7 @@ int wnd_set_used(struct wnd_bitmap *wnd, size_t bit, size_t bits) lock_buffer(bh); - __bitmap_set(buf, wbit, op); + ntfs_bitmap_set_le(buf, wbit, op); wnd->free_bits[iw] -= op; set_buffer_uptodate(bh); @@ -1370,7 +1370,7 @@ int wnd_extend(struct wnd_bitmap *wnd, size_t new_bits) lock_buffer(bh); buf = (ulong *)bh->b_data; - __bitmap_clear(buf, b0, blocksize * 8 - b0); + ntfs_bitmap_clear_le(buf, b0, blocksize * 8 - b0); frb = wbits - __bitmap_weight(buf, wbits); wnd->total_zeroes += frb - wnd->free_bits[iw]; wnd->free_bits[iw] = frb; @@ -1489,3 +1489,43 @@ int ntfs_trim_fs(struct ntfs_sb_info *sbi, struct fstrim_range *range) return err; } + +void ntfs_bitmap_set_le(unsigned long *map, unsigned int start, int len) +{ + unsigned long *p = map + BIT_WORD(start); + const unsigned int size = start + len; + int bits_to_set = BITS_PER_LONG - (start % BITS_PER_LONG); + unsigned long mask_to_set = cpu_to_le32(BITMAP_FIRST_WORD_MASK(start)); + + while (len - bits_to_set >= 0) { + *p |= mask_to_set; + len -= bits_to_set; + bits_to_set = BITS_PER_LONG; + mask_to_set = ~0UL; + p++; + } + if (len) { + mask_to_set &= cpu_to_le32(BITMAP_LAST_WORD_MASK(size)); + *p |= mask_to_set; + } +} + +void ntfs_bitmap_clear_le(unsigned long *map, unsigned int start, int len) +{ + unsigned long *p = map + BIT_WORD(start); + const unsigned int size = start + len; + int bits_to_clear = BITS_PER_LONG - (start % BITS_PER_LONG); + unsigned long mask_to_clear = cpu_to_le32(BITMAP_FIRST_WORD_MASK(start)); + + while (len - bits_to_clear >= 0) { + *p &= ~mask_to_clear; + len -= bits_to_clear; + bits_to_clear = BITS_PER_LONG; + mask_to_clear = ~0UL; + p++; + } + if (len) { + mask_to_clear &= cpu_to_le32(BITMAP_LAST_WORD_MASK(size)); + *p &= ~mask_to_clear; + } +} diff --git a/fs/ntfs3/fslog.c b/fs/ntfs3/fslog.c index 06492f088d60..5ec7dbad3add 100644 --- a/fs/ntfs3/fslog.c +++ b/fs/ntfs3/fslog.c @@ -3646,7 +3646,7 @@ static int do_action(struct ntfs_log *log, struct OPEN_ATTR_ENRTY *oe, goto dirty_vol; } - __bitmap_set(Add2Ptr(buffer_le, roff), bmp_off, bmp_bits); + ntfs_bitmap_set_le(Add2Ptr(buffer_le, roff), bmp_off, bmp_bits); a_dirty = true; break; @@ -3660,7 +3660,7 @@ static int do_action(struct ntfs_log *log, struct OPEN_ATTR_ENRTY *oe, goto dirty_vol; } - __bitmap_clear(Add2Ptr(buffer_le, roff), bmp_off, bmp_bits); + ntfs_bitmap_clear_le(Add2Ptr(buffer_le, roff), bmp_off, bmp_bits); a_dirty = true; break; diff --git a/fs/ntfs3/ntfs_fs.h b/fs/ntfs3/ntfs_fs.h index 8aaec7e0804e..aaecddeff4e5 100644 --- a/fs/ntfs3/ntfs_fs.h +++ b/fs/ntfs3/ntfs_fs.h @@ -828,6 +828,9 @@ int wnd_extend(struct wnd_bitmap *wnd, size_t new_bits); void wnd_zone_set(struct wnd_bitmap *wnd, size_t Lcn, size_t Len); int ntfs_trim_fs(struct ntfs_sb_info *sbi, struct fstrim_range *range); +void ntfs_bitmap_set_le(unsigned long *map, unsigned int start, int len); +void ntfs_bitmap_clear_le(unsigned long *map, unsigned int start, int len); + /* Globals from upcase.c */ int ntfs_cmp_names(const __le16 *s1, size_t l1, const __le16 *s2, size_t l2, const u16 *upcase, bool bothcase); -- 2.25.1 ^ permalink raw reply related [flat|nested] 8+ messages in thread
* Re: [PATCH 2/3] fs/ntfs3: add functions to modify LE bitmaps 2021-12-07 10:24 ` [PATCH 2/3] fs/ntfs3: add functions to modify LE bitmaps Thomas Kühnel @ 2021-12-07 17:31 ` kernel test robot 0 siblings, 0 replies; 8+ messages in thread From: kernel test robot @ 2021-12-07 17:31 UTC (permalink / raw) To: Thomas Kühnel, Konstantin Komarov Cc: kbuild-all, ntfs3, linux-kernel, Thomas Kühnel, Nicolas Schier Hi "Thomas, Thank you for the patch! Perhaps something to improve: [auto build test WARNING on 0fcfb00b28c0b7884635dacf38e46d60bf3d4eb1] url: https://github.com/0day-ci/linux/commits/Thomas-K-hnel/fs-ntfs3-Fixes-for-big-endian-systems/20211207-184206 base: 0fcfb00b28c0b7884635dacf38e46d60bf3d4eb1 config: arm64-randconfig-s031-20211207 (https://download.01.org/0day-ci/archive/20211208/202112080045.huYZOn4p-lkp@intel.com/config) compiler: aarch64-linux-gcc (GCC) 11.2.0 reproduce: wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross chmod +x ~/bin/make.cross # apt-get install sparse # sparse version: v0.6.4-dirty # https://github.com/0day-ci/linux/commit/2227622e39d3100d10077199481f05ccb9a17204 git remote add linux-review https://github.com/0day-ci/linux git fetch --no-tags linux-review Thomas-K-hnel/fs-ntfs3-Fixes-for-big-endian-systems/20211207-184206 git checkout 2227622e39d3100d10077199481f05ccb9a17204 # save the config file to linux build tree mkdir build_dir COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-11.2.0 make.cross C=1 CF='-fdiagnostic-prefix -D__CHECK_ENDIAN__' O=build_dir ARCH=arm64 SHELL=/bin/bash fs/ntfs3/ If you fix the issue, kindly add following tag as appropriate Reported-by: kernel test robot <lkp@intel.com> sparse warnings: (new ones prefixed by >>) >> fs/ntfs3/bitmap.c:1498:37: sparse: sparse: incorrect type in initializer (different base types) @@ expected unsigned long mask_to_set @@ got restricted __le32 [usertype] @@ fs/ntfs3/bitmap.c:1498:37: sparse: expected unsigned long mask_to_set fs/ntfs3/bitmap.c:1498:37: sparse: got restricted __le32 [usertype] >> fs/ntfs3/bitmap.c:1508:29: sparse: sparse: invalid assignment: &= >> fs/ntfs3/bitmap.c:1508:29: sparse: left side has type unsigned long >> fs/ntfs3/bitmap.c:1508:29: sparse: right side has type restricted __le32 >> fs/ntfs3/bitmap.c:1518:39: sparse: sparse: incorrect type in initializer (different base types) @@ expected unsigned long mask_to_clear @@ got restricted __le32 [usertype] @@ fs/ntfs3/bitmap.c:1518:39: sparse: expected unsigned long mask_to_clear fs/ntfs3/bitmap.c:1518:39: sparse: got restricted __le32 [usertype] fs/ntfs3/bitmap.c:1528:31: sparse: sparse: invalid assignment: &= fs/ntfs3/bitmap.c:1528:31: sparse: left side has type unsigned long fs/ntfs3/bitmap.c:1528:31: sparse: right side has type restricted __le32 vim +1498 fs/ntfs3/bitmap.c 1492 1493 void ntfs_bitmap_set_le(unsigned long *map, unsigned int start, int len) 1494 { 1495 unsigned long *p = map + BIT_WORD(start); 1496 const unsigned int size = start + len; 1497 int bits_to_set = BITS_PER_LONG - (start % BITS_PER_LONG); > 1498 unsigned long mask_to_set = cpu_to_le32(BITMAP_FIRST_WORD_MASK(start)); 1499 1500 while (len - bits_to_set >= 0) { 1501 *p |= mask_to_set; 1502 len -= bits_to_set; 1503 bits_to_set = BITS_PER_LONG; 1504 mask_to_set = ~0UL; 1505 p++; 1506 } 1507 if (len) { > 1508 mask_to_set &= cpu_to_le32(BITMAP_LAST_WORD_MASK(size)); 1509 *p |= mask_to_set; 1510 } 1511 } 1512 1513 void ntfs_bitmap_clear_le(unsigned long *map, unsigned int start, int len) 1514 { 1515 unsigned long *p = map + BIT_WORD(start); 1516 const unsigned int size = start + len; 1517 int bits_to_clear = BITS_PER_LONG - (start % BITS_PER_LONG); > 1518 unsigned long mask_to_clear = cpu_to_le32(BITMAP_FIRST_WORD_MASK(start)); --- 0-DAY CI Kernel Test Service, Intel Corporation https://lists.01.org/hyperkitty/list/kbuild-all@lists.01.org ^ permalink raw reply [flat|nested] 8+ messages in thread
* [PATCH 3/3] fs/ntfs3: use _le variants of bitops functions 2021-12-07 10:24 [PATCH 0/3] fs/ntfs3: Fixes for big endian systems Thomas Kühnel 2021-12-07 10:24 ` [PATCH 1/3] fs/ntfs3: fix endian conversion in ni_fname_name Thomas Kühnel 2021-12-07 10:24 ` [PATCH 2/3] fs/ntfs3: add functions to modify LE bitmaps Thomas Kühnel @ 2021-12-07 10:24 ` Thomas Kühnel 2022-12-30 12:07 ` [PATCH 0/3] fs/ntfs3: Fixes for big endian systems Konstantin Komarov 3 siblings, 0 replies; 8+ messages in thread From: Thomas Kühnel @ 2021-12-07 10:24 UTC (permalink / raw) To: Konstantin Komarov; +Cc: ntfs3, linux-kernel, Thomas Kühnel The functions from bitops.h already have _le variants so use them to prevent invalid reads/writes of the bitmap on big endian systems. Signed-off-by: Thomas Kühnel <thomas.kuehnel@avm.de> --- fs/ntfs3/bitmap.c | 10 +++++----- fs/ntfs3/fsntfs.c | 8 ++++---- fs/ntfs3/index.c | 14 +++++++------- 3 files changed, 16 insertions(+), 16 deletions(-) diff --git a/fs/ntfs3/bitmap.c b/fs/ntfs3/bitmap.c index b61cf533b030..e3dc6714ef25 100644 --- a/fs/ntfs3/bitmap.c +++ b/fs/ntfs3/bitmap.c @@ -71,7 +71,7 @@ static size_t wnd_scan(const ulong *buf, size_t wbit, u32 wpos, u32 wend, while (wpos < wend) { size_t free_len; u32 free_bits, end; - u32 used = find_next_zero_bit(buf, wend, wpos); + u32 used = find_next_zero_bit_le(buf, wend, wpos); if (used >= wend) { if (*b_len < *prev_tail) { @@ -97,7 +97,7 @@ static size_t wnd_scan(const ulong *buf, size_t wbit, u32 wpos, u32 wend, * Now we have a fragment [wpos, wend) staring with 0. */ end = wpos + to_alloc - *prev_tail; - free_bits = find_next_bit(buf, min(end, wend), wpos); + free_bits = find_next_bit_le(buf, min(end, wend), wpos); free_len = *prev_tail + free_bits - wpos; @@ -579,7 +579,7 @@ static int wnd_rescan(struct wnd_bitmap *wnd) wbits = wnd->nbits - wbit; do { - used = find_next_zero_bit(buf, wbits, wpos); + used = find_next_zero_bit_le(buf, wbits, wpos); if (used > wpos && prev_tail) { wnd_add_free_ext(wnd, wbit + wpos - prev_tail, @@ -595,7 +595,7 @@ static int wnd_rescan(struct wnd_bitmap *wnd) break; } - frb = find_next_bit(buf, wbits, wpos); + frb = find_next_bit_le(buf, wbits, wpos); if (frb >= wbits) { /* Keep last free block. */ prev_tail += frb - wpos; @@ -1457,7 +1457,7 @@ int ntfs_trim_fs(struct ntfs_sb_info *sbi, struct fstrim_range *range) buf = (ulong *)bh->b_data; for (; wbit < wbits; wbit++) { - if (!test_bit(wbit, buf)) { + if (!test_bit_le(wbit, buf)) { if (!len) lcn = lcn_wnd + wbit; len += 1; diff --git a/fs/ntfs3/fsntfs.c b/fs/ntfs3/fsntfs.c index 4de9acb16968..1f801c9eae67 100644 --- a/fs/ntfs3/fsntfs.c +++ b/fs/ntfs3/fsntfs.c @@ -618,13 +618,13 @@ int ntfs_look_free_mft(struct ntfs_sb_info *sbi, CLST *rno, bool mft, NULL, 0, NULL, NULL)) goto next; - __clear_bit(ir - MFT_REC_RESERVED, + __clear_bit_le(ir - MFT_REC_RESERVED, &sbi->mft.reserved_bitmap); } } /* Scan 5 bits for zero. Bit 0 == MFT_REC_RESERVED */ - zbit = find_next_zero_bit(&sbi->mft.reserved_bitmap, + zbit = find_next_zero_bit_le(&sbi->mft.reserved_bitmap, MFT_REC_FREE, MFT_REC_RESERVED); if (zbit >= MFT_REC_FREE) { sbi->mft.next_reserved = MFT_REC_FREE; @@ -692,7 +692,7 @@ int ntfs_look_free_mft(struct ntfs_sb_info *sbi, CLST *rno, bool mft, if (*rno >= MFT_REC_FREE) wnd_set_used(wnd, *rno, 1); else if (*rno >= MFT_REC_RESERVED && sbi->mft.reserved_bitmap_inited) - __set_bit(*rno - MFT_REC_RESERVED, &sbi->mft.reserved_bitmap); + __set_bit_le(*rno - MFT_REC_RESERVED, &sbi->mft.reserved_bitmap); out: if (!mft) @@ -718,7 +718,7 @@ void ntfs_mark_rec_free(struct ntfs_sb_info *sbi, CLST rno) else wnd_set_free(wnd, rno, 1); } else if (rno >= MFT_REC_RESERVED && sbi->mft.reserved_bitmap_inited) { - __clear_bit(rno - MFT_REC_RESERVED, &sbi->mft.reserved_bitmap); + __clear_bit_le(rno - MFT_REC_RESERVED, &sbi->mft.reserved_bitmap); } if (rno < wnd_zone_bit(wnd)) diff --git a/fs/ntfs3/index.c b/fs/ntfs3/index.c index 6f81e3a49abf..9547422200ab 100644 --- a/fs/ntfs3/index.c +++ b/fs/ntfs3/index.c @@ -323,7 +323,7 @@ static int indx_mark_used(struct ntfs_index *indx, struct ntfs_inode *ni, if (err) return err; - __set_bit(bit - bbuf.bit, bbuf.buf); + __set_bit_le(bit - bbuf.bit, bbuf.buf); bmp_buf_put(&bbuf, true); @@ -343,7 +343,7 @@ static int indx_mark_free(struct ntfs_index *indx, struct ntfs_inode *ni, if (err) return err; - __clear_bit(bit - bbuf.bit, bbuf.buf); + __clear_bit_le(bit - bbuf.bit, bbuf.buf); bmp_buf_put(&bbuf, true); @@ -457,7 +457,7 @@ static int scan_nres_bitmap(struct ntfs_inode *ni, struct ATTRIB *bitmap, static bool scan_for_free(const ulong *buf, u32 bit, u32 bits, size_t *ret) { - size_t pos = find_next_zero_bit(buf, bits, bit); + size_t pos = find_next_zero_bit_le(buf, bits, bit); if (pos >= bits) return false; @@ -489,7 +489,7 @@ static int indx_find_free(struct ntfs_index *indx, struct ntfs_inode *ni, if (!b->non_res) { u32 nbits = 8 * le32_to_cpu(b->res.data_size); - size_t pos = find_next_zero_bit(resident_data(b), nbits, 0); + size_t pos = find_next_zero_bit_le(resident_data(b), nbits, 0); if (pos < nbits) *bit = pos; @@ -505,7 +505,7 @@ static int indx_find_free(struct ntfs_index *indx, struct ntfs_inode *ni, static bool scan_for_used(const ulong *buf, u32 bit, u32 bits, size_t *ret) { - size_t pos = find_next_bit(buf, bits, bit); + size_t pos = find_next_bit_le(buf, bits, bit); if (pos >= bits) return false; @@ -536,7 +536,7 @@ int indx_used_bit(struct ntfs_index *indx, struct ntfs_inode *ni, size_t *bit) if (!b->non_res) { u32 nbits = le32_to_cpu(b->res.data_size) * 8; - size_t pos = find_next_bit(resident_data(b), nbits, from); + size_t pos = find_next_bit_le(resident_data(b), nbits, from); if (pos < nbits) *bit = pos; @@ -1954,7 +1954,7 @@ static int indx_shrink(struct ntfs_index *indx, struct ntfs_inode *ni, if (bit >= nbits) return 0; - pos = find_next_bit(bm, nbits, bit); + pos = find_next_bit_le(bm, nbits, bit); if (pos < nbits) return 0; } else { -- 2.25.1 ^ permalink raw reply related [flat|nested] 8+ messages in thread
* Re: [PATCH 0/3] fs/ntfs3: Fixes for big endian systems 2021-12-07 10:24 [PATCH 0/3] fs/ntfs3: Fixes for big endian systems Thomas Kühnel ` (2 preceding siblings ...) 2021-12-07 10:24 ` [PATCH 3/3] fs/ntfs3: use _le variants of bitops functions Thomas Kühnel @ 2022-12-30 12:07 ` Konstantin Komarov 3 siblings, 0 replies; 8+ messages in thread From: Konstantin Komarov @ 2022-12-30 12:07 UTC (permalink / raw) To: Thomas Kühnel; +Cc: ntfs3, linux-kernel On 07.12.2021 14:24, Thomas Kühnel wrote: > I tried running the NTFS3 driver on a MIPS big endian system and > noticed various errors when it tried to access bitmaps structures > that are stored as little endian on disk. > > These patches were mainly tested in a qemu mips environment. > > I'm open for suggestions how to better implement the second patch > "add functions to modify LE bitmaps". It adds copies of two functions > from lib/bitmap.c but modified to work with little endian bitmaps. > Other filesystems seem to have similar functions defined locally like > le_bitmap_set in btrfs or ext4_set_bits in ext4 but no global > implementation exists. > > Thomas Kühnel (3): > fs/ntfs3: fix endian conversion in ni_fname_name > fs/ntfs3: add functions to modify LE bitmaps > fs/ntfs3: use _le variants of bitops functions > > fs/ntfs3/bitmap.c | 56 +++++++++++++++++++++++++++++++++++++++------- > fs/ntfs3/frecord.c | 4 +++- > fs/ntfs3/fslog.c | 4 ++-- > fs/ntfs3/fsntfs.c | 8 +++---- > fs/ntfs3/index.c | 14 ++++++------ > fs/ntfs3/ntfs_fs.h | 3 +++ > 6 files changed, 67 insertions(+), 22 deletions(-) > > > base-commit: 0fcfb00b28c0b7884635dacf38e46d60bf3d4eb1 Hello Thomas, Thanks for patches, they have been applied long ago. Sorry for not responding immediately. ^ permalink raw reply [flat|nested] 8+ messages in thread
end of thread, other threads:[~2022-12-30 12:07 UTC | newest] Thread overview: 8+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2021-12-07 10:24 [PATCH 0/3] fs/ntfs3: Fixes for big endian systems Thomas Kühnel 2021-12-07 10:24 ` [PATCH 1/3] fs/ntfs3: fix endian conversion in ni_fname_name Thomas Kühnel 2021-12-07 16:00 ` kernel test robot 2021-12-09 10:50 ` Thomas Kühnel 2021-12-07 10:24 ` [PATCH 2/3] fs/ntfs3: add functions to modify LE bitmaps Thomas Kühnel 2021-12-07 17:31 ` kernel test robot 2021-12-07 10:24 ` [PATCH 3/3] fs/ntfs3: use _le variants of bitops functions Thomas Kühnel 2022-12-30 12:07 ` [PATCH 0/3] fs/ntfs3: Fixes for big endian systems Konstantin Komarov
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).