From d9038d99fb5c623f43bcd8b726bfbbe8562648c2 Mon Sep 17 00:00:00 2001 From: Namjae Jeon Date: Thu, 5 Mar 2026 10:40:54 +0900 Subject: [PATCH] ntfs: change mft_no type to u64 Changes the type of ntfs_inode::mft_no from unsigned long to u64 to safely handle the full 48-bit range without truncation risk, especially in preparation for broader VFS inode number type (i_ino:u64) and to improve consistency with ntfs driver practices. Signed-off-by: Namjae Jeon --- fs/ntfs/aops.c | 6 ++-- fs/ntfs/attrib.c | 26 +++++++-------- fs/ntfs/compress.c | 4 +-- fs/ntfs/dir.c | 38 +++++++++++----------- fs/ntfs/inode.c | 64 ++++++++++++++++++------------------ fs/ntfs/inode.h | 9 +++--- fs/ntfs/lcnalloc.c | 2 +- fs/ntfs/mft.c | 81 ++++++++++++++++++++++------------------------ fs/ntfs/mft.h | 7 ++-- fs/ntfs/namei.c | 10 +++--- 10 files changed, 119 insertions(+), 128 deletions(-) diff --git a/fs/ntfs/aops.c b/fs/ntfs/aops.c index 01ed11f568908..78d1ce41958e0 100644 --- a/fs/ntfs/aops.c +++ b/fs/ntfs/aops.c @@ -96,7 +96,7 @@ static sector_t ntfs_bmap(struct address_space *mapping, sector_t block) unsigned int delta; unsigned char blocksize_bits; - ntfs_debug("Entering for mft_no 0x%lx, logical block 0x%llx.", + ntfs_debug("Entering for mft_no 0x%llx, logical block 0x%llx.", ni->mft_no, (unsigned long long)block); if (ni->type != AT_DATA || !NInoNonResident(ni) || NInoEncrypted(ni) || NInoMstProtected(ni)) { @@ -144,12 +144,12 @@ static sector_t ntfs_bmap(struct address_space *mapping, sector_t block) goto hole; case LCN_ENOMEM: ntfs_error(vol->sb, - "Not enough memory to complete mapping for inode 0x%lx. Returning 0.", + "Not enough memory to complete mapping for inode 0x%llx. Returning 0.", ni->mft_no); break; default: ntfs_error(vol->sb, - "Failed to complete mapping for inode 0x%lx. Run chkdsk. Returning 0.", + "Failed to complete mapping for inode 0x%llx. Run chkdsk. Returning 0.", ni->mft_no); break; } diff --git a/fs/ntfs/attrib.c b/fs/ntfs/attrib.c index 2af45df2aab13..d86d96051c701 100644 --- a/fs/ntfs/attrib.c +++ b/fs/ntfs/attrib.c @@ -370,7 +370,7 @@ s64 ntfs_attr_vcn_to_lcn_nolock(struct ntfs_inode *ni, const s64 vcn, unsigned long flags; bool is_retry = false; - ntfs_debug("Entering for i_ino 0x%lx, vcn 0x%llx, %s_locked.", + ntfs_debug("Entering for i_ino 0x%llx, vcn 0x%llx, %s_locked.", ni->mft_no, (unsigned long long)vcn, write_locked ? "write" : "read"); if (!ni->runlist.rl) { @@ -521,7 +521,7 @@ struct runlist_element *ntfs_attr_find_vcn_nolock(struct ntfs_inode *ni, const s int err = 0; bool is_retry = false; - ntfs_debug("Entering for i_ino 0x%lx, vcn 0x%llx, with%s ctx.", + ntfs_debug("Entering for i_ino 0x%llx, vcn 0x%llx, with%s ctx.", ni->mft_no, (unsigned long long)vcn, ctx ? "" : "out"); if (!ni->runlist.rl) { read_lock_irqsave(&ni->size_lock, flags); @@ -679,8 +679,8 @@ static int ntfs_attr_find(const __le32 type, const __le16 *name, if (a->name_length && ((le16_to_cpu(a->name_offset) + a->name_length * sizeof(__le16)) > le32_to_cpu(a->length))) { - ntfs_error(vol->sb, "Corrupt attribute name in MFT record %lld\n", - (long long)ctx->ntfs_ino->mft_no); + ntfs_error(vol->sb, "Corrupt attribute name in MFT record %llu\n", + ctx->ntfs_ino->mft_no); break; } @@ -790,7 +790,7 @@ int load_attribute_list(struct ntfs_inode *base_ni, u8 *al_start, const s64 size attr_vi = ntfs_attr_iget(VFS_I(base_ni), AT_ATTRIBUTE_LIST, AT_UNNAMED, 0); if (IS_ERR(attr_vi)) { ntfs_error(base_ni->vol->sb, - "Failed to open an inode for Attribute list, mft = %ld", + "Failed to open an inode for Attribute list, mft = %llu", base_ni->mft_no); return PTR_ERR(attr_vi); } @@ -798,7 +798,7 @@ int load_attribute_list(struct ntfs_inode *base_ni, u8 *al_start, const s64 size if (ntfs_inode_attr_pread(attr_vi, 0, size, al_start) != size) { iput(attr_vi); ntfs_error(base_ni->vol->sb, - "Failed to read attribute list, mft = %ld", + "Failed to read attribute list, mft = %llu", base_ni->mft_no); return -EIO; } @@ -817,7 +817,7 @@ int load_attribute_list(struct ntfs_inode *base_ni, u8 *al_start, const s64 size break; } if (al != al_start + size) { - ntfs_error(base_ni->vol->sb, "Corrupt attribute list, mft = %ld", + ntfs_error(base_ni->vol->sb, "Corrupt attribute list, mft = %llu", base_ni->mft_no); return -EIO; } @@ -890,7 +890,7 @@ static int ntfs_external_attr_find(const __le32 type, int err = 0; static const char *es = " Unmount and run chkdsk."; - ntfs_debug("Entering for inode 0x%lx, type 0x%x.", ni->mft_no, type); + ntfs_debug("Entering for inode 0x%llx, type 0x%x.", ni->mft_no, type); if (!base_ni) { /* First call happens with the base mft record. */ base_ni = ctx->base_ntfs_ino = ctx->ntfs_ino; @@ -1090,7 +1090,7 @@ is_enumeration: if (MREF_LE(al_entry->mft_reference) == ni->mft_no) { if (MSEQNO_LE(al_entry->mft_reference) != ni->seq_no) { ntfs_error(vol->sb, - "Found stale mft reference in attribute list of base inode 0x%lx.%s", + "Found stale mft reference in attribute list of base inode 0x%llx.%s", base_ni->mft_no, es); err = -EIO; break; @@ -1112,7 +1112,7 @@ is_enumeration: al_entry->mft_reference), &ni); if (IS_ERR(ctx->mrec)) { ntfs_error(vol->sb, - "Failed to map extent mft record 0x%lx of base inode 0x%lx.%s", + "Failed to map extent mft record 0x%lx of base inode 0x%llx.%s", MREF_LE(al_entry->mft_reference), base_ni->mft_no, es); err = PTR_ERR(ctx->mrec); @@ -1201,7 +1201,7 @@ corrupt: if (!err) { ntfs_error(vol->sb, - "Base inode 0x%lx contains corrupt attribute list attribute.%s", + "Base inode 0x%llx contains corrupt attribute list attribute.%s", base_ni->mft_no, es); err = -EIO; } @@ -3497,7 +3497,7 @@ retry: * delete extent) and continue search. */ if (finished_build) { - ntfs_debug("Mark attr 0x%x for delete in inode 0x%lx.\n", + ntfs_debug("Mark attr 0x%x for delete in inode 0x%llx.\n", (unsigned int)le32_to_cpu(a->type), ctx->ntfs_ino->mft_no); a->data.non_resident.highest_vcn = cpu_to_le64(NTFS_VCN_DELETE_MARK); mark_mft_record_dirty(ctx->ntfs_ino); @@ -4728,7 +4728,7 @@ int ntfs_attr_map_cluster(struct ntfs_inode *ni, s64 vcn_start, s64 *lcn_start, CASE_SENSITIVE, vcn, NULL, 0, ctx); if (err) { ntfs_error(vol->sb, - "ntfs_attr_lookup failed, ntfs inode(mft_no : %ld) type : 0x%x, err : %d", + "ntfs_attr_lookup failed, ntfs inode(mft_no : %llu) type : 0x%x, err : %d", ni->mft_no, ni->type, err); goto out; } diff --git a/fs/ntfs/compress.c b/fs/ntfs/compress.c index e443451f4351d..71a8d9c42674f 100644 --- a/fs/ntfs/compress.c +++ b/fs/ntfs/compress.c @@ -797,7 +797,7 @@ lock_retry_remap: */ if (err) { ntfs_error(vol->sb, - "ntfs_decompress() failed in inode 0x%lx with error code %i. Skipping this compression block.", + "ntfs_decompress() failed in inode 0x%llx with error code %i. Skipping this compression block.", ni->mft_no, -err); /* Release the unfinished pages. */ for (; prev_cur_page < cur_page; prev_cur_page++) { @@ -823,7 +823,7 @@ lock_retry_remap: page = pages[cur_page]; if (page) { ntfs_error(vol->sb, - "Still have pages left! Terminating them with extreme prejudice. Inode 0x%lx, page index 0x%lx.", + "Still have pages left! Terminating them with extreme prejudice. Inode 0x%llx, page index 0x%lx.", ni->mft_no, page->__folio_index); flush_dcache_page(page); kunmap_local(page_address(page)); diff --git a/fs/ntfs/dir.c b/fs/ntfs/dir.c index ae7aa0adc8368..30ac696c4ba7b 100644 --- a/fs/ntfs/dir.c +++ b/fs/ntfs/dir.c @@ -102,7 +102,7 @@ u64 ntfs_lookup_inode_by_name(struct ntfs_inode *dir_ni, const __le16 *uname, if (unlikely(err)) { if (err == -ENOENT) { ntfs_error(sb, - "Index root attribute missing in directory inode 0x%lx.", + "Index root attribute missing in directory inode 0x%llx.", dir_ni->mft_no); err = -EIO; } @@ -338,29 +338,29 @@ fast_descend_into_child_node: /* Bounds checks. */ if ((u8 *)ia < kaddr || (u8 *)ia > kaddr + PAGE_SIZE) { ntfs_error(sb, - "Out of bounds check failed. Corrupt directory inode 0x%lx or driver bug.", + "Out of bounds check failed. Corrupt directory inode 0x%llx or driver bug.", dir_ni->mft_no); goto unm_err_out; } /* Catch multi sector transfer fixup errors. */ if (unlikely(!ntfs_is_indx_record(ia->magic))) { ntfs_error(sb, - "Directory index record with vcn 0x%llx is corrupt. Corrupt inode 0x%lx. Run chkdsk.", - (unsigned long long)vcn, dir_ni->mft_no); + "Directory index record with vcn 0x%llx is corrupt. Corrupt inode 0x%llx. Run chkdsk.", + vcn, dir_ni->mft_no); goto unm_err_out; } if (le64_to_cpu(ia->index_block_vcn) != vcn) { ntfs_error(sb, - "Actual VCN (0x%llx) of index buffer is different from expected VCN (0x%llx). Directory inode 0x%lx is corrupt or driver bug.", - (unsigned long long)le64_to_cpu(ia->index_block_vcn), - (unsigned long long)vcn, dir_ni->mft_no); + "Actual VCN (0x%llx) of index buffer is different from expected VCN (0x%llx). Directory inode 0x%llx is corrupt or driver bug.", + le64_to_cpu(ia->index_block_vcn), + vcn, dir_ni->mft_no); goto unm_err_out; } if (le32_to_cpu(ia->index.allocated_size) + 0x18 != dir_ni->itype.index.block_size) { ntfs_error(sb, - "Index buffer (VCN 0x%llx) of directory inode 0x%lx has a size (%u) differing from the directory specified size (%u). Directory inode is corrupt or driver bug.", - (unsigned long long)vcn, dir_ni->mft_no, + "Index buffer (VCN 0x%llx) of directory inode 0x%llx has a size (%u) differing from the directory specified size (%u). Directory inode is corrupt or driver bug.", + vcn, dir_ni->mft_no, le32_to_cpu(ia->index.allocated_size) + 0x18, dir_ni->itype.index.block_size); goto unm_err_out; @@ -368,15 +368,15 @@ fast_descend_into_child_node: index_end = (u8 *)ia + dir_ni->itype.index.block_size; if (index_end > kaddr + PAGE_SIZE) { ntfs_error(sb, - "Index buffer (VCN 0x%llx) of directory inode 0x%lx crosses page boundary. Impossible! Cannot access! This is probably a bug in the driver.", - (unsigned long long)vcn, dir_ni->mft_no); + "Index buffer (VCN 0x%llx) of directory inode 0x%llx crosses page boundary. Impossible! Cannot access! This is probably a bug in the driver.", + vcn, dir_ni->mft_no); goto unm_err_out; } index_end = (u8 *)&ia->index + le32_to_cpu(ia->index.index_length); if (index_end > (u8 *)ia + dir_ni->itype.index.block_size) { ntfs_error(sb, - "Size of index buffer (VCN 0x%llx) of directory inode 0x%lx exceeds maximum size.", - (unsigned long long)vcn, dir_ni->mft_no); + "Size of index buffer (VCN 0x%llx) of directory inode 0x%llx exceeds maximum size.", + vcn, dir_ni->mft_no); goto unm_err_out; } /* The first index entry. */ @@ -393,7 +393,7 @@ fast_descend_into_child_node: (u8 *)ie + sizeof(struct index_entry_header) > index_end || (u8 *)ie + sizeof(struct index_entry_header) + le16_to_cpu(ie->key_length) > index_end || (u8 *)ie + le16_to_cpu(ie->length) > index_end) { - ntfs_error(sb, "Index entry out of bounds in directory inode 0x%lx.", + ntfs_error(sb, "Index entry out of bounds in directory inode 0x%llx.", dir_ni->mft_no); goto unm_err_out; } @@ -546,7 +546,7 @@ found_it2: if (ie->flags & INDEX_ENTRY_NODE) { if ((ia->index.flags & NODE_MASK) == LEAF_NODE) { ntfs_error(sb, - "Index entry with child node found in a leaf node in directory inode 0x%lx.", + "Index entry with child node found in a leaf node in directory inode 0x%llx.", dir_ni->mft_no); goto unm_err_out; } @@ -566,7 +566,7 @@ found_it2: kaddr = NULL; goto descend_into_child_node; } - ntfs_error(sb, "Negative child node vcn in directory inode 0x%lx.", + ntfs_error(sb, "Negative child node vcn in directory inode 0x%llx.", dir_ni->mft_no); goto unm_err_out; } @@ -863,7 +863,7 @@ static int ntfs_readdir(struct file *file, struct dir_context *actor) /* Find the index root attribute in the mft record. */ if (ntfs_attr_lookup(AT_INDEX_ROOT, I30, 4, CASE_SENSITIVE, 0, NULL, 0, ctx)) { - ntfs_error(sb, "Index root attribute missing in directory inode %ld", + ntfs_error(sb, "Index root attribute missing in directory inode %llu", ndir->mft_no); ntfs_attr_put_search_ctx(ctx); err = -ENOMEM; @@ -1062,8 +1062,8 @@ int ntfs_check_empty_dir(struct ntfs_inode *ni, struct mft_record *ni_mrec) ret = ntfs_attr_lookup(AT_INDEX_ROOT, I30, 4, CASE_SENSITIVE, 0, NULL, 0, ctx); if (ret) { - ntfs_error(ni->vol->sb, "Index root attribute missing in directory inode %lld", - (unsigned long long)ni->mft_no); + ntfs_error(ni->vol->sb, "Index root attribute missing in directory inode %llu", + ni->mft_no); ntfs_attr_put_search_ctx(ctx); return ret; } diff --git a/fs/ntfs/inode.c b/fs/ntfs/inode.c index 7d4c33b3b7a29..cfa95998d3cd1 100644 --- a/fs/ntfs/inode.c +++ b/fs/ntfs/inode.c @@ -89,7 +89,7 @@ static int ntfs_init_locked_inode(struct inode *vi, void *data) struct ntfs_attr *na = data; struct ntfs_inode *ni = NTFS_I(vi); - vi->i_ino = na->mft_no; + vi->i_ino = (unsigned long)na->mft_no; if (na->type == AT_INDEX_ALLOCATION) NInoSetMstProtected(ni); @@ -149,7 +149,7 @@ static int ntfs_read_locked_index_inode(struct inode *base_vi, * Return the struct inode on success. Check the return value with IS_ERR() and * if true, the function failed and the error code is obtained from PTR_ERR(). */ -struct inode *ntfs_iget(struct super_block *sb, unsigned long mft_no) +struct inode *ntfs_iget(struct super_block *sb, u64 mft_no) { struct inode *vi; int err; @@ -500,7 +500,7 @@ void __ntfs_init_inode(struct super_block *sb, struct ntfs_inode *ni) static struct lock_class_key extent_inode_mrec_lock_key; inline struct ntfs_inode *ntfs_new_extent_inode(struct super_block *sb, - unsigned long mft_no) + u64 mft_no) { struct ntfs_inode *ni = ntfs_alloc_extent_inode(); @@ -1451,9 +1451,9 @@ unm_err_out: err_out: if (err != -ENOENT) ntfs_error(vol->sb, - "Failed with error code %i while reading attribute inode (mft_no 0x%lx, type 0x%x, name_len %i). Marking corrupt inode and base inode 0x%lx as bad. Run chkdsk.", - err, vi->i_ino, ni->type, ni->name_len, - base_vi->i_ino); + "Failed with error code %i while reading attribute inode (mft_no 0x%llx, type 0x%x, name_len %i). Marking corrupt inode and base inode 0x%llx as bad. Run chkdsk.", + err, ni->mft_no, ni->type, ni->name_len, + base_ni->mft_no); if (err != -ENOENT && err != -ENOMEM) NVolSetErrors(vol); return err; @@ -1709,8 +1709,8 @@ unm_err_out: unmap_mft_record(base_ni); err_out: ntfs_error(vi->i_sb, - "Failed with error code %i while reading index inode (mft_no 0x%lx, name_len %i.", - err, vi->i_ino, ni->name_len); + "Failed with error code %i while reading index inode (mft_no 0x%llx, name_len %i.", + err, ni->mft_no, ni->name_len); if (err != -EOPNOTSUPP && err != -ENOMEM) NVolSetErrors(vol); return err; @@ -2244,7 +2244,7 @@ static void __ntfs_clear_inode(struct ntfs_inode *ni) void ntfs_clear_extent_inode(struct ntfs_inode *ni) { - ntfs_debug("Entering for inode 0x%lx.", ni->mft_no); + ntfs_debug("Entering for inode 0x%llx.", ni->mft_no); WARN_ON(NInoAttr(ni)); WARN_ON(ni->nr_extents != -1); @@ -2580,7 +2580,7 @@ int ntfs_inode_sync_filename(struct ntfs_inode *ni) int err = 0; unsigned long flags; - ntfs_debug("Entering for inode %lld\n", (long long)ni->mft_no); + ntfs_debug("Entering for inode %llu\n", ni->mft_no); ctx = ntfs_attr_get_search_ctx(ni, NULL); if (!ctx) @@ -2623,8 +2623,8 @@ int ntfs_inode_sync_filename(struct ntfs_inode *ni) ictx = ntfs_index_ctx_get(index_ni, I30, 4); if (!ictx) { - ntfs_error(sb, "Failed to get index ctx, inode %lld", - (long long)index_ni->mft_no); + ntfs_error(sb, "Failed to get index ctx, inode %llu", + index_ni->mft_no); iput(index_vi); mutex_unlock(&index_ni->mrec_lock); continue; @@ -2632,8 +2632,8 @@ int ntfs_inode_sync_filename(struct ntfs_inode *ni) err = ntfs_index_lookup(fn, sizeof(struct file_name_attr), ictx); if (err) { - ntfs_debug("Index lookup failed, inode %lld", - (long long)index_ni->mft_no); + ntfs_debug("Index lookup failed, inode %llu", + index_ni->mft_no); ntfs_index_ctx_put(ictx); iput(index_vi); mutex_unlock(&index_ni->mrec_lock); @@ -2679,8 +2679,8 @@ int ntfs_inode_sync_filename(struct ntfs_inode *ni) } /* Check for real error occurred. */ if (err != -ENOENT) { - ntfs_error(sb, "Attribute lookup failed, err : %d, inode %lld", err, - (long long)ni->mft_no); + ntfs_error(sb, "Attribute lookup failed, err : %d, inode %llu", err, + ni->mft_no); } else err = 0; @@ -2927,9 +2927,8 @@ static struct ntfs_inode *ntfs_extent_inode_open(struct ntfs_inode *base_ni, return NULL; sb = base_ni->vol->sb; - ntfs_debug("Opening extent inode %lld (base mft record %lld).\n", - (unsigned long long)mft_no, - (unsigned long long)base_ni->mft_no); + ntfs_debug("Opening extent inode %llu (base mft record %llu).\n", + mft_no, base_ni->mft_no); /* Is the extent inode already open and attached to the base inode? */ if (base_ni->nr_extents > 0) { @@ -2942,7 +2941,7 @@ static struct ntfs_inode *ntfs_extent_inode_open(struct ntfs_inode *base_ni, continue; ni_mrec = map_mft_record(ni); if (IS_ERR(ni_mrec)) { - ntfs_error(sb, "failed to map mft record for %lu", + ntfs_error(sb, "failed to map mft record for %llu", ni->mft_no); goto out; } @@ -2950,8 +2949,8 @@ static struct ntfs_inode *ntfs_extent_inode_open(struct ntfs_inode *base_ni, seq_no = MSEQNO_LE(mref); if (seq_no && seq_no != le16_to_cpu(ni_mrec->sequence_number)) { - ntfs_error(sb, "Found stale extent mft reference mft=%lld", - (long long)ni->mft_no); + ntfs_error(sb, "Found stale extent mft reference mft=%llu", + ni->mft_no); unmap_mft_record(ni); goto out; } @@ -3011,7 +3010,7 @@ int ntfs_inode_attach_all_extents(struct ntfs_inode *ni) if (NInoAttr(ni)) ni = ni->ext.base_ntfs_ino; - ntfs_debug("Entering for inode 0x%llx.\n", (long long) ni->mft_no); + ntfs_debug("Entering for inode 0x%llx.\n", ni->mft_no); /* Inode haven't got attribute list, thus nothing to attach. */ if (!NInoAttrList(ni)) @@ -3057,7 +3056,7 @@ int ntfs_inode_add_attrlist(struct ntfs_inode *ni) if (!ni) return -EINVAL; - ntfs_debug("inode %llu\n", (unsigned long long) ni->mft_no); + ntfs_debug("inode %llu\n", ni->mft_no); if (NInoAttrList(ni) || ni->nr_extents) { ntfs_error(ni->vol->sb, "Inode already has attribute list"); @@ -3122,8 +3121,8 @@ int ntfs_inode_add_attrlist(struct ntfs_inode *ni) /* Check for real error occurred. */ if (err != -ENOENT) { - ntfs_error(ni->vol->sb, "%s: Attribute lookup failed, inode %lld", - __func__, (long long)ni->mft_no); + ntfs_error(ni->vol->sb, "%s: Attribute lookup failed, inode %llu", + __func__, ni->mft_no); goto put_err_out; } @@ -3244,7 +3243,7 @@ int ntfs_inode_close(struct ntfs_inode *ni) if (!ni) return 0; - ntfs_debug("Entering for inode %lld\n", (long long)ni->mft_no); + ntfs_debug("Entering for inode %llu\n", ni->mft_no); /* Is this a base inode with mapped extent inodes? */ /* @@ -3282,8 +3281,8 @@ int ntfs_inode_close(struct ntfs_inode *ni) } if (NInoDirty(ni)) - ntfs_error(ni->vol->sb, "Releasing dirty inode %lld!\n", - (long long)ni->mft_no); + ntfs_error(ni->vol->sb, "Releasing dirty inode %llu!\n", + ni->mft_no); if (NInoAttrList(ni) && ni->attr_list) kvfree(ni->attr_list); ntfs_destroy_ext_inode(ni); @@ -3301,8 +3300,8 @@ void ntfs_destroy_ext_inode(struct ntfs_inode *ni) ntfs_attr_close(ni); if (NInoDirty(ni)) - ntfs_error(ni->vol->sb, "Releasing dirty ext inode %lld!\n", - (long long)ni->mft_no); + ntfs_error(ni->vol->sb, "Releasing dirty ext inode %llu!\n", + ni->mft_no); if (NInoAttrList(ni) && ni->attr_list) kvfree(ni->attr_list); kfree(ni->mrec); @@ -3366,8 +3365,7 @@ int ntfs_inode_free_space(struct ntfs_inode *ni, int size) if (!ni || size < 0) return -EINVAL; - ntfs_debug("Entering for inode %lld, size %d\n", - (unsigned long long)ni->mft_no, size); + ntfs_debug("Entering for inode %llu, size %d\n", ni->mft_no, size); sb = ni->vol->sb; ni_mrec = map_mft_record(ni); diff --git a/fs/ntfs/inode.h b/fs/ntfs/inode.h index 5de9e9a76dfa5..67942b97fac6d 100644 --- a/fs/ntfs/inode.h +++ b/fs/ntfs/inode.h @@ -100,7 +100,7 @@ struct ntfs_inode { rwlock_t size_lock; unsigned long state; __le32 flags; - unsigned long mft_no; + u64 mft_no; u16 seq_no; atomic_t count; struct ntfs_volume *vol; @@ -292,7 +292,7 @@ static inline struct inode *VFS_I(struct ntfs_inode *ni) * possible on all architectures. */ struct ntfs_attr { - unsigned long mft_no; + u64 mft_no; __le16 *name; u32 name_len; __le32 type; @@ -300,7 +300,7 @@ struct ntfs_attr { }; int ntfs_test_inode(struct inode *vi, void *data); -struct inode *ntfs_iget(struct super_block *sb, unsigned long mft_no); +struct inode *ntfs_iget(struct super_block *sb, u64 mft_no); struct inode *ntfs_attr_iget(struct inode *base_vi, __le32 type, __le16 *name, u32 name_len); struct inode *ntfs_index_iget(struct inode *base_vi, __le16 *name, @@ -320,8 +320,7 @@ static inline void ntfs_init_big_inode(struct inode *vi) ni->mft_no = vi->i_ino; } -struct ntfs_inode *ntfs_new_extent_inode(struct super_block *sb, - unsigned long mft_no); +struct ntfs_inode *ntfs_new_extent_inode(struct super_block *sb, u64 mft_no); void ntfs_clear_extent_inode(struct ntfs_inode *ni); int ntfs_read_inode_mount(struct inode *vi); int ntfs_show_options(struct seq_file *sf, struct dentry *root); diff --git a/fs/ntfs/lcnalloc.c b/fs/ntfs/lcnalloc.c index 6f4df07e37269..237f13a11df3c 100644 --- a/fs/ntfs/lcnalloc.c +++ b/fs/ntfs/lcnalloc.c @@ -842,7 +842,7 @@ s64 __ntfs_cluster_free(struct ntfs_inode *ni, const s64 start_vcn, s64 count, int err; unsigned int memalloc_flags; - ntfs_debug("Entering for i_ino 0x%lx, start_vcn 0x%llx, count 0x%llx.%s", + ntfs_debug("Entering for i_ino 0x%llx, start_vcn 0x%llx, count 0x%llx.%s", ni->mft_no, start_vcn, count, is_rollback ? " (rollback)" : ""); vol = ni->vol; diff --git a/fs/ntfs/mft.c b/fs/ntfs/mft.c index b313793a397cc..2665857af01e9 100644 --- a/fs/ntfs/mft.c +++ b/fs/ntfs/mft.c @@ -26,14 +26,14 @@ * Returns 0 if the checks are successful. If not, return -EIO. */ int ntfs_mft_record_check(const struct ntfs_volume *vol, struct mft_record *m, - unsigned long mft_no) + u64 mft_no) { struct attr_record *a; struct super_block *sb = vol->sb; if (!ntfs_is_file_record(m->magic)) { ntfs_error(sb, "Record %llu has no FILE magic (0x%x)\n", - (unsigned long long)mft_no, le32_to_cpu(*(__le32 *)m)); + mft_no, le32_to_cpu(*(__le32 *)m)); goto err_out; } @@ -41,36 +41,33 @@ int ntfs_mft_record_check(const struct ntfs_volume *vol, struct mft_record *m, (vol->mft_record_size >> NTFS_BLOCK_SIZE_BITS) + 1 != le16_to_cpu(m->usa_count) || le16_to_cpu(m->usa_ofs) + le16_to_cpu(m->usa_count) * 2 > vol->mft_record_size) { ntfs_error(sb, "Record %llu has corrupt fix-up values fields\n", - (unsigned long long)mft_no); + mft_no); goto err_out; } if (le32_to_cpu(m->bytes_allocated) != vol->mft_record_size) { ntfs_error(sb, "Record %llu has corrupt allocation size (%u <> %u)\n", - (unsigned long long)mft_no, - vol->mft_record_size, + mft_no, vol->mft_record_size, le32_to_cpu(m->bytes_allocated)); goto err_out; } if (le32_to_cpu(m->bytes_in_use) > vol->mft_record_size) { ntfs_error(sb, "Record %llu has corrupt in-use size (%u > %u)\n", - (unsigned long long)mft_no, - le32_to_cpu(m->bytes_in_use), + mft_no, le32_to_cpu(m->bytes_in_use), vol->mft_record_size); goto err_out; } if (le16_to_cpu(m->attrs_offset) & 7) { ntfs_error(sb, "Attributes badly aligned in record %llu\n", - (unsigned long long)mft_no); + mft_no); goto err_out; } a = (struct attr_record *)((char *)m + le16_to_cpu(m->attrs_offset)); if ((char *)a < (char *)m || (char *)a > (char *)m + vol->mft_record_size) { - ntfs_error(sb, "Record %llu is corrupt\n", - (unsigned long long)mft_no); + ntfs_error(sb, "Record %llu is corrupt\n", mft_no); goto err_out; } @@ -125,7 +122,7 @@ static inline struct mft_record *map_mft_record_folio(struct ntfs_inode *ni) vol->mft_record_size) { folio = ERR_PTR(-ENOENT); ntfs_error(vol->sb, - "Attempt to read mft record 0x%lx, which is beyond the end of the mft. This is probably a bug in the ntfs driver.", + "Attempt to read mft record 0x%llx, which is beyond the end of the mft. This is probably a bug in the ntfs driver.", ni->mft_no); goto err_out; } @@ -192,7 +189,7 @@ struct mft_record *map_mft_record(struct ntfs_inode *ni) if (!ni) return ERR_PTR(-EINVAL); - ntfs_debug("Entering for mft_no 0x%lx.", ni->mft_no); + ntfs_debug("Entering for mft_no 0x%llx.", ni->mft_no); /* Make sure the ntfs inode doesn't go away. */ atomic_inc(&ni->count); @@ -230,7 +227,7 @@ void unmap_mft_record(struct ntfs_inode *ni) if (!ni) return; - ntfs_debug("Entering for mft_no 0x%lx.", ni->mft_no); + ntfs_debug("Entering for mft_no 0x%llx.", ni->mft_no); folio = ni->folio; if (atomic_dec_return(&ni->count) > 1) @@ -258,11 +255,11 @@ struct mft_record *map_extent_mft_record(struct ntfs_inode *base_ni, u64 mref, struct ntfs_inode *ni = NULL; struct ntfs_inode **extent_nis = NULL; int i; - unsigned long mft_no = MREF(mref); + u64 mft_no = MREF(mref); u16 seq_no = MSEQNO(mref); bool destroy_ni = false; - ntfs_debug("Mapping extent mft record 0x%lx (base mft record 0x%lx).", + ntfs_debug("Mapping extent mft record 0x%llx (base mft record 0x%llx).", mft_no, base_ni->mft_no); /* Make sure the base ntfs inode doesn't go away. */ atomic_inc(&base_ni->count); @@ -410,7 +407,7 @@ void __mark_mft_record_dirty(struct ntfs_inode *ni) { struct ntfs_inode *base_ni; - ntfs_debug("Entering for inode 0x%lx.", ni->mft_no); + ntfs_debug("Entering for inode 0x%llx.", ni->mft_no); WARN_ON(NInoAttr(ni)); /* Determine the base vfs inode and mark it dirty, too. */ if (likely(ni->nr_extents >= 0)) @@ -449,7 +446,7 @@ static void ntfs_bio_end_io(struct bio *bio) * * NOTE: We always perform synchronous i/o. */ -int ntfs_sync_mft_mirror(struct ntfs_volume *vol, const unsigned long mft_no, +int ntfs_sync_mft_mirror(struct ntfs_volume *vol, const u64 mft_no, struct mft_record *m) { u8 *kmirr = NULL; @@ -458,7 +455,7 @@ int ntfs_sync_mft_mirror(struct ntfs_volume *vol, const unsigned long mft_no, int err = 0; struct bio *bio; - ntfs_debug("Entering for inode 0x%lx.", mft_no); + ntfs_debug("Entering for inode 0x%llx.", mft_no); if (unlikely(!vol->mftmirr_ino)) { /* This could happen during umount... */ @@ -511,7 +508,7 @@ unlock_folio: if (likely(!err)) { ntfs_debug("Done."); } else { - ntfs_error(vol->sb, "I/O error while writing mft mirror record 0x%lx!", mft_no); + ntfs_error(vol->sb, "I/O error while writing mft mirror record 0x%llx!", mft_no); err_out: ntfs_error(vol->sb, "Failed to synchronize $MFTMirr (error code %i). Volume will be left marked dirty on umount. Run chkdsk on the partition after umounting to correct this.", @@ -547,7 +544,7 @@ int write_mft_record_nolock(struct ntfs_inode *ni, struct mft_record *m, int syn struct bio *bio; unsigned int offset = 0, folio_size; - ntfs_debug("Entering for inode 0x%lx.", ni->mft_no); + ntfs_debug("Entering for inode 0x%llx.", ni->mft_no); WARN_ON(NInoAttr(ni)); WARN_ON(!folio_test_locked(folio)); @@ -609,7 +606,7 @@ int write_mft_record_nolock(struct ntfs_inode *ni, struct mft_record *m, int syn if (unlikely(err)) { /* I/O error during writing. This is really bad! */ ntfs_error(vol->sb, - "I/O error while writing mft record 0x%lx! Marking base inode as bad. You should unmount the volume and run chkdsk.", + "I/O error while writing mft record 0x%llx! Marking base inode as bad. You should unmount the volume and run chkdsk.", ni->mft_no); goto err_out; } @@ -734,7 +731,7 @@ static int ntfs_test_inode_wb(struct inode *vi, unsigned long ino, void *data) * If we manage to obtain the lock we have exclusive access to the extent mft * record. We set @locked_ni to the now locked ntfs inode and return 'true'. */ -bool ntfs_may_write_mft_record(struct ntfs_volume *vol, const unsigned long mft_no, +static bool ntfs_may_write_mft_record(struct ntfs_volume *vol, const u64 mft_no, const struct mft_record *m, struct ntfs_inode **locked_ni, struct inode **ref_vi) { @@ -745,7 +742,7 @@ bool ntfs_may_write_mft_record(struct ntfs_volume *vol, const unsigned long mft_ int i; struct ntfs_attr na = {0}; - ntfs_debug("Entering for inode 0x%lx.", mft_no); + ntfs_debug("Entering for inode 0x%llx.", mft_no); /* * Normally we do not return a locked inode so set @locked_ni to NULL. */ @@ -756,7 +753,7 @@ bool ntfs_may_write_mft_record(struct ntfs_volume *vol, const unsigned long mft_ * Check if the inode corresponding to this mft record is in the VFS * inode cache and obtain a reference to it if it is. */ - ntfs_debug("Looking for inode 0x%lx in icache.", mft_no); + ntfs_debug("Looking for inode 0x%llx in icache.", mft_no); na.mft_no = mft_no; na.type = AT_UNUSED; /* @@ -778,28 +775,28 @@ bool ntfs_may_write_mft_record(struct ntfs_volume *vol, const unsigned long mft_ return false; } if (vi) { - ntfs_debug("Base inode 0x%lx is in icache.", mft_no); + ntfs_debug("Base inode 0x%llx is in icache.", mft_no); /* The inode is in icache. */ ni = NTFS_I(vi); /* Take a reference to the ntfs inode. */ atomic_inc(&ni->count); /* If the inode is dirty, do not write this record. */ if (NInoDirty(ni)) { - ntfs_debug("Inode 0x%lx is dirty, do not write it.", + ntfs_debug("Inode 0x%llx is dirty, do not write it.", mft_no); atomic_dec(&ni->count); *ref_vi = vi; return false; } - ntfs_debug("Inode 0x%lx is not dirty.", mft_no); + ntfs_debug("Inode 0x%llx is not dirty.", mft_no); /* The inode is not dirty, try to take the mft record lock. */ if (unlikely(!mutex_trylock(&ni->mrec_lock))) { - ntfs_debug("Mft record 0x%lx is already locked, do not write it.", mft_no); + ntfs_debug("Mft record 0x%llx is already locked, do not write it.", mft_no); atomic_dec(&ni->count); *ref_vi = vi; return false; } - ntfs_debug("Managed to lock mft record 0x%lx, write it.", + ntfs_debug("Managed to lock mft record 0x%llx, write it.", mft_no); /* * The write has to occur while we hold the mft record lock so @@ -808,17 +805,17 @@ bool ntfs_may_write_mft_record(struct ntfs_volume *vol, const unsigned long mft_ *locked_ni = ni; return true; } - ntfs_debug("Inode 0x%lx is not in icache.", mft_no); + ntfs_debug("Inode 0x%llx is not in icache.", mft_no); /* The inode is not in icache. */ /* Write the record if it is not a mft record (type "FILE"). */ if (!ntfs_is_mft_record(m->magic)) { - ntfs_debug("Mft record 0x%lx is not a FILE record, write it.", + ntfs_debug("Mft record 0x%llx is not a FILE record, write it.", mft_no); return true; } /* Write the mft record if it is a base inode. */ if (!m->base_mft_record) { - ntfs_debug("Mft record 0x%lx is a base record, write it.", + ntfs_debug("Mft record 0x%llx is a base record, write it.", mft_no); return true; } @@ -829,7 +826,7 @@ bool ntfs_may_write_mft_record(struct ntfs_volume *vol, const unsigned long mft_ */ na.mft_no = MREF_LE(m->base_mft_record); na.state = 0; - ntfs_debug("Mft record 0x%lx is an extent record. Looking for base inode 0x%lx in icache.", + ntfs_debug("Mft record 0x%llx is an extent record. Looking for base inode 0x%llx in icache.", mft_no, na.mft_no); if (!na.mft_no) { /* Balance the below iput(). */ @@ -843,7 +840,7 @@ bool ntfs_may_write_mft_record(struct ntfs_volume *vol, const unsigned long mft_ if (!vi) return false; - ntfs_debug("Base inode 0x%lx is in icache.", na.mft_no); + ntfs_debug("Base inode 0x%llx is in icache.", na.mft_no); /* * The base inode is in icache. Check if it has the extent inode * corresponding to this extent mft record attached. @@ -857,7 +854,7 @@ bool ntfs_may_write_mft_record(struct ntfs_volume *vol, const unsigned long mft_ */ mutex_unlock(&ni->extent_lock); *ref_vi = vi; - ntfs_debug("Base inode 0x%lx has no attached extent inodes, write the extent record.", + ntfs_debug("Base inode 0x%llx has no attached extent inodes, write the extent record.", na.mft_no); return true; } @@ -880,11 +877,11 @@ bool ntfs_may_write_mft_record(struct ntfs_volume *vol, const unsigned long mft_ if (!eni) { mutex_unlock(&ni->extent_lock); *ref_vi = vi; - ntfs_debug("Extent inode 0x%lx is not attached to its base inode 0x%lx, write the extent record.", + ntfs_debug("Extent inode 0x%llx is not attached to its base inode 0x%llx, write the extent record.", mft_no, na.mft_no); return true; } - ntfs_debug("Extent inode 0x%lx is attached to its base inode 0x%lx.", + ntfs_debug("Extent inode 0x%llx is attached to its base inode 0x%llx.", mft_no, na.mft_no); /* Take a reference to the extent ntfs inode. */ atomic_inc(&eni->count); @@ -904,11 +901,11 @@ bool ntfs_may_write_mft_record(struct ntfs_volume *vol, const unsigned long mft_ if (unlikely(!mutex_trylock(&eni->mrec_lock))) { atomic_dec(&eni->count); *ref_vi = vi; - ntfs_debug("Extent mft record 0x%lx is already locked, do not write it.", + ntfs_debug("Extent mft record 0x%llx is already locked, do not write it.", mft_no); return false; } - ntfs_debug("Managed to lock extent mft record 0x%lx, write it.", + ntfs_debug("Managed to lock extent mft record 0x%llx, write it.", mft_no); /* * The write has to occur while we hold the mft record lock so return @@ -941,7 +938,7 @@ static const char *es = " Leaving inconsistent metadata. Unmount and run chkds * * Locking: Caller must hold vol->mftbmp_lock for writing. */ -static int ntfs_mft_bitmap_find_and_alloc_free_rec_nolock(struct ntfs_volume *vol, +static s64 ntfs_mft_bitmap_find_and_alloc_free_rec_nolock(struct ntfs_volume *vol, struct ntfs_inode *base_ni) { s64 pass_end, ll, data_pos, pass_start, ofs, bit; @@ -2711,7 +2708,7 @@ static int ntfs_write_mft_block(struct folio *folio, struct writeback_control *w sizeof(struct inode *), GFP_NOFS); int nr_ref_inos = 0; struct bio *bio = NULL; - unsigned long mft_no; + u64 mft_no; struct ntfs_inode *tni; s64 lcn; s64 vcn = ntfs_pidx_to_cluster(vol, folio->index); @@ -2875,7 +2872,7 @@ unm_done: else base_tni = tni->ext.base_ntfs_ino; mutex_unlock(&tni->extent_lock); - ntfs_debug("Unlocking %s inode 0x%lx.", + ntfs_debug("Unlocking %s inode 0x%llx.", tni == base_tni ? "base" : "extent", tni->mft_no); atomic_dec(&tni->count); diff --git a/fs/ntfs/mft.h b/fs/ntfs/mft.h index 5201d5da73a4a..75a51a98d0f6e 100644 --- a/fs/ntfs/mft.h +++ b/fs/ntfs/mft.h @@ -42,7 +42,7 @@ static inline void mark_mft_record_dirty(struct ntfs_inode *ni) __mark_mft_record_dirty(ni); } -int ntfs_sync_mft_mirror(struct ntfs_volume *vol, const unsigned long mft_no, +int ntfs_sync_mft_mirror(struct ntfs_volume *vol, const u64 mft_no, struct mft_record *m); int write_mft_record_nolock(struct ntfs_inode *ni, struct mft_record *m, int sync); @@ -76,9 +76,6 @@ static inline int write_mft_record(struct ntfs_inode *ni, struct mft_record *m, return err; } -bool ntfs_may_write_mft_record(struct ntfs_volume *vol, - const unsigned long mft_no, const struct mft_record *m, - struct ntfs_inode **locked_ni, struct inode **ref_vi); int ntfs_mft_record_alloc(struct ntfs_volume *vol, const int mode, struct ntfs_inode **ni, struct ntfs_inode *base_ni, struct mft_record **ni_mrec); @@ -86,7 +83,7 @@ int ntfs_mft_record_free(struct ntfs_volume *vol, struct ntfs_inode *ni); int ntfs_mft_records_write(const struct ntfs_volume *vol, const u64 mref, const s64 count, struct mft_record *b); int ntfs_mft_record_check(const struct ntfs_volume *vol, struct mft_record *m, - unsigned long mft_no); + u64 mft_no); int ntfs_mft_writepages(struct address_space *mapping, struct writeback_control *wbc); void ntfs_mft_mark_dirty(struct folio *folio); diff --git a/fs/ntfs/namei.c b/fs/ntfs/namei.c index 2952b377dda23..331b66fe6b7da 100644 --- a/fs/ntfs/namei.c +++ b/fs/ntfs/namei.c @@ -508,7 +508,7 @@ static struct ntfs_inode *__ntfs_create(struct mnt_idmap *idmap, struct inode *d spin_unlock(&vi->i_lock); /* Add the inode to the inode hash for the superblock. */ - vi->i_ino = ni->mft_no; + vi->i_ino = (unsigned long)ni->mft_no; inode_set_iversion(vi, 1); insert_inode_hash(vi); @@ -521,7 +521,7 @@ static struct ntfs_inode *__ntfs_create(struct mnt_idmap *idmap, struct inode *d dni_mrec = map_mft_record(dir_ni); if (IS_ERR(dni_mrec)) { - ntfs_error(dir_ni->vol->sb, "failed to map mft record for file %ld.\n", + ntfs_error(dir_ni->vol->sb, "failed to map mft record for file 0x%llx.\n", dir_ni->mft_no); err = -EIO; goto err_out; @@ -810,7 +810,7 @@ no_hardlink: static int ntfs_test_inode_attr(struct inode *vi, void *data) { struct ntfs_inode *ni = NTFS_I(vi); - unsigned long mft_no = (unsigned long)data; + u64 mft_no = (u64)data; if (ni->mft_no != mft_no) return 0; @@ -904,7 +904,7 @@ search: /* Ignore hard links from other directories */ if (dir_ni->mft_no != MREF_LE(fn->parent_directory)) { - ntfs_debug("MFT record numbers don't match (%lu != %lu)\n", + ntfs_debug("MFT record numbers don't match (%llu != %lu)\n", dir_ni->mft_no, MREF_LE(fn->parent_directory)); continue; @@ -1363,7 +1363,7 @@ static int ntfs_rename(struct mnt_idmap *idmap, struct inode *old_dir, if (err) { int err2; - ntfs_error(sb, "Failed to delete old ntfs inode(%ld) in old dir, err : %d\n", + ntfs_error(sb, "Failed to delete old ntfs inode(%llu) in old dir, err : %d\n", old_ni->mft_no, err); err2 = ntfs_delete(old_ni, new_dir_ni, uname_new, new_name_len, false); if (err2) -- 2.47.3