/* Add new fragment into run storage. */
if (!run_add_entry(run, vcn, lcn, flen, opt == ALLOCATE_MFT)) {
+ /* Undo last 'ntfs_look_for_free_space' */
down_write_nested(&wnd->rw_lock, BITMAP_MUTEX_CLUSTERS);
wnd_set_free(wnd, lcn, flen);
up_write(&wnd->rw_lock);
run_close(run);
out1:
kfree(attr_s);
- /* Reinsert le. */
out:
return err;
}
u16 ro;
attr = ni_find_attr(ni, NULL, NULL, type, name, name_len, &vcn, NULL);
- if (!attr)
+ if (!attr) {
+ /* Is record corrupted? */
return -ENOENT;
+ }
svcn = le64_to_cpu(attr->nres.svcn);
evcn = le64_to_cpu(attr->nres.evcn);
- if (evcn < vcn || vcn < svcn)
+ if (evcn < vcn || vcn < svcn) {
+ /* Is record corrupted? */
return -EINVAL;
+ }
ro = le16_to_cpu(attr->nres.run_off);
err = run_unpack_ex(run, ni->mi.sbi, ni->mi.rno, svcn, evcn, svcn,
}
/*
- * attr_wof_load_runs_range - Load runs for given range [from to).
+ * attr_load_runs_range - Load runs for given range [from to).
*/
int attr_load_runs_range(struct ntfs_inode *ni, enum ATTR_TYPE type,
const __le16 *name, u8 name_len, struct runs_tree *run,
total_size = le64_to_cpu(attr_b->nres.total_size);
if (vbo >= alloc_size) {
- // NOTE: It is allowed.
+ /* NOTE: It is allowed. */
return 0;
}
bytes -= vbo;
if ((vbo & mask) || (bytes & mask)) {
- /* We have to zero a range(s)*/
+ /* We have to zero a range(s). */
if (frame_size == NULL) {
- /* Caller insists range is aligned */
+ /* Caller insists range is aligned. */
return -EINVAL;
}
*frame_size = mask + 1;
size_t key;
};
-/* Tree is sorted by start (key). */
struct e_node {
struct rb_node_key start; /* Tree sorted by start. */
struct rb_node_key count; /* Tree sorted by len. */
sb = wnd->sb;
log2_bits = sb->s_blocksize_bits + 3;
- /* At most two ranges [hint, max_alloc) + [0, hint) */
+ /* At most two ranges [hint, max_alloc) + [0, hint). */
Again:
/* TODO: Optimize request for case nbits > wbits. */
continue;
}
- /* Read window */
+ /* Read window. */
bh = wnd_map(wnd, iw);
if (IS_ERR(bh)) {
// TODO: Error.
/*
* ntfs_zero_range - Helper function for punch_hole.
- * It zeroes a range [vbo, vbo_to)
+ *
+ * It zeroes a range [vbo, vbo_to).
*/
static int ntfs_zero_range(struct inode *inode, u64 vbo, u64 vbo_to)
{
if (!buffer_mapped(bh)) {
ntfs_get_block(inode, iblock, bh, 0);
- /* unmapped? It's a hole - nothing to do */
+ /* Unmapped? It's a hole - nothing to do. */
if (!buffer_mapped(bh))
continue;
}
- /* Ok, it's mapped. Make sure it's up-to-date */
+ /* Ok, it's mapped. Make sure it's up-to-date. */
if (PageUptodate(page))
set_buffer_uptodate(bh);
}
/*
- * ntfs_sparse_cluster
+ * ntfs_sparse_cluster - Helper function to zero a new allocated clusters.
*
- * Helper function to zero a new allocated clusters
* NOTE: 512 <= cluster size <= 2M
*/
void ntfs_sparse_cluster(struct inode *inode, struct page *page0, CLST vcn,
truncate_pagecache(inode, vbo_down);
if (!is_sparsed(ni) && !is_compressed(ni)) {
- /* normal file */
+ /* Normal file. */
err = ntfs_zero_range(inode, vbo, end);
goto out;
}
if (err != E_NTFS_NOTALIGNED)
goto out;
- /* process not aligned punch */
+ /* Process not aligned punch. */
mask = frame_size - 1;
vbo_a = (vbo + mask) & ~mask;
end_a = end & ~mask;
if (err)
goto out;
- /* Wait for existing dio to complete */
+ /* Wait for existing dio to complete. */
inode_dio_wait(inode);
truncate_pagecache(inode, vbo_down);
goto out;
if (WARN_ON(ni->ni_flags & NI_FLAG_COMPRESSED_MASK)) {
- /* Should never be here, see ntfs_file_open() */
+ /* Should never be here, see ntfs_file_open(). */
ret = -EOPNOTSUPP;
goto out;
}
/*
* ni_add_mi - Add new mft_inode into ntfs_inode.
-*/
+ */
static void ni_add_mi(struct ntfs_inode *ni, struct mft_inode *mi)
{
ni_ins_mi(ni, &ni->mi_tree, mi->rno, &mi->node);
rb_erase(&mi->node, &ni->mi_tree);
}
-/* ni_std
- *
- * Return: Pointer into std_info from primary record.
+/*
+ * ni_std - Return: Pointer into std_info from primary record.
*/
struct ATTR_STD_INFO *ni_std(struct ntfs_inode *ni)
{
/*
* ni_remove_attr - Remove all attributes for the given type/name/id.
-*/
+ */
int ni_remove_attr(struct ntfs_inode *ni, enum ATTR_TYPE type,
const __le16 *name, size_t name_len, bool base_only,
const __le16 *id)
/*
* ni_create_attr_list - Generates an attribute list for this primary record.
-*/
+ */
int ni_create_attr_list(struct ntfs_inode *ni)
{
struct ntfs_sb_info *sbi = ni->mi.sbi;
if (is_mft_data &&
(mi_enum_attr(mi, NULL) ||
vbo <= ((u64)mi->rno << sbi->record_bits))) {
- /* We can't accept this record 'case MFT's bootstrapping. */
+ /* We can't accept this record 'cause MFT's bootstrapping. */
continue;
}
if (is_mft &&
*/
max_free = free;
- /* Estimate the result of moving all possible attributes away.*/
+ /* Estimate the result of moving all possible attributes away. */
attr = NULL;
while ((attr = mi_enum_attr(&ni->mi, attr))) {
goto out;
}
- /* Start real attribute moving */
+ /* Start real attribute moving. */
attr = NULL;
for (;;) {
node = next;
}
- /* Free base record */
+ /* Free base record. */
clear_rec_inuse(ni->mi.mrec);
ni->mi.dirty = true;
err = mi_write(&ni->mi, 0);
}
if (attr->non_res && is_attr_sparsed(attr)) {
- /* Sarsed attribute header is 8 bytes bigger than normal. */
+ /* Sparsed attribute header is 8 bytes bigger than normal. */
struct MFT_REC *rec = mi->mrec;
u32 used = le32_to_cpu(rec->used);
u32 asize = le32_to_cpu(attr->size);
mutex_lock(&sbi->compress.mtx_xpress);
ctx = sbi->compress.xpress;
if (!ctx) {
- /* Lazy initialize Xpress decompress context */
+ /* Lazy initialize Xpress decompress context. */
ctx = xpress_allocate_decompressor();
if (!ctx) {
err = -ENOMEM;
/*
* ni_read_frame
*
- * Pages - array of locked pages.
+ * Pages - Array of locked pages.
*/
int ni_read_frame(struct ntfs_inode *ni, u64 frame_vbo, struct page **pages,
u32 pages_per_frame)
lznt = NULL;
}
- /* Compress: frame_mem -> frame_ondisk. */
+ /* Compress: frame_mem -> frame_ondisk */
compr_size = compress_lznt(frame_mem, frame_size, frame_ondisk,
frame_size, sbi->compress.lznt);
mutex_unlock(&sbi->compress.mtx_lznt);
/* Compute the log page values. */
log->data_off = ALIGN(
offsetof(struct RECORD_PAGE_HDR, fixups) +
- sizeof(short) * ((log->page_size >> SECTOR_SHIFT) + 1), 8);
+ sizeof(short) * ((log->page_size >> SECTOR_SHIFT) + 1),
+ 8);
log->data_size = log->page_size - log->data_off;
log->record_header_len = sizeof(struct LFS_RECORD_HDR);
/* Compute the restart page values. */
log->ra_off = ALIGN(
offsetof(struct RESTART_HDR, fixups) +
- sizeof(short) * ((log->sys_page_size >> SECTOR_SHIFT) + 1), 8);
+ sizeof(short) *
+ ((log->sys_page_size >> SECTOR_SHIFT) + 1),
+ 8);
log->restart_size = log->sys_page_size - log->ra_off;
log->ra_size = struct_size(log->ra, clients, 1);
log->current_openlog_count = open_log_count;
rh->sys_page_size = cpu_to_le32(log->page_size);
rh->page_size = cpu_to_le32(log->page_size);
- t16 = ALIGN(offsetof(struct RESTART_HDR, fixups) +
- sizeof(short) * t16, 8);
+ t16 = ALIGN(offsetof(struct RESTART_HDR, fixups) + sizeof(short) * t16,
+ 8);
rh->ra_off = cpu_to_le16(t16);
rh->minor_ver = cpu_to_le16(1); // 0x1A:
rh->major_ver = cpu_to_le16(1); // 0x1C:
if (sb_rdonly(sb) || !initialized)
goto out;
- /* Fill LogFile by '-1' if it is initialized.ssss */
+ /* Fill LogFile by '-1' if it is initialized. */
err = ntfs_bio_fill_1(sbi, &ni->file.run);
out:
/* verify(!ntfs_update_mftmirr()); */
/*
- * if we used wait=1, sync_inode_metadata waits for the io for the
+ * If we used wait=1, sync_inode_metadata waits for the io for the
* inode to finish. It hangs when media is removed.
* So wait=0 is sent down to sync_inode_metadata
- * and filemap_fdatawrite is used for the data blocks
+ * and filemap_fdatawrite is used for the data blocks.
*/
err = sync_inode_metadata(&ni->vfs_inode, 0);
if (!err)
sbi->security.next_id = SECURITY_ID_FIRST;
/* Always write new security at the end of bucket. */
sbi->security.next_off =
- ALIGN(sds_size - SecurityDescriptorsBlockSize, 16);
+ ALIGN(sds_size - SecurityDescriptorsBlockSize, 16);
off = 0;
ne = NULL;
e_fname = (struct ATTR_FILE_NAME *)(e + 1);
if (!memcmp(&e_fname->dup, dup, sizeof(*dup))) {
- /* Nothing to update in index! Try to avoid this call. */
+ /*
+ * Nothing to update in index! Try to avoid this call.
+ */
goto out;
}
memcpy(&e_fname->dup, dup, sizeof(*dup));
if (fnd->level) {
- /* directory entry in index */
+ /* Directory entry in index. */
err = indx_write(indx, ni, fnd->nodes[fnd->level - 1], sync);
} else {
- /* directory entry in directory MFT record */
+ /* Directory entry in directory MFT record. */
mi->dirty = true;
if (sync)
err = mi_write(mi, 1);
}
if (le32_to_cpu(rec->total) != sbi->record_size) {
- // Bad inode?
+ /* Bad inode? */
err = -EINVAL;
goto out;
}
if (vbo >= valid)
set_buffer_new(bh);
} else if (create) {
- /*normal write*/
+ /* Normal write. */
if (bytes > bh->b_size)
bytes = bh->b_size;
/*
* ntfs_reparse_bytes
*
- * Number of bytes to for REPARSE_DATA_BUFFER(IO_REPARSE_TAG_SYMLINK)
+ * Number of bytes for REPARSE_DATA_BUFFER(IO_REPARSE_TAG_SYMLINK)
* for unicode string of @uni_len length.
*/
static inline u32 ntfs_reparse_bytes(u32 uni_len)
return ERR_PTR(-EINVAL);
if (S_ISDIR(mode)) {
- /* use parent's directory attributes */
+ /* Use parent's directory attributes. */
fa = dir_ni->std_fa | FILE_ATTRIBUTE_DIRECTORY |
FILE_ATTRIBUTE_ARCHIVE;
/*
- * By default child directory inherits parent attributes
- * root directory is hidden + system
- * Make an exception for children in root
+ * By default child directory inherits parent attributes.
+ * Root directory is hidden + system.
+ * Make an exception for children in root.
*/
if (dir->i_ino == MFT_REC_ROOT)
fa &= ~(FILE_ATTRIBUTE_HIDDEN | FILE_ATTRIBUTE_SYSTEM);
fa = FILE_ATTRIBUTE_REPARSE_POINT;
/*
- * linux: there are dir/file/symlink and so on.
- * NTFS: symlinks are "dir + reparse" or "file + reparse".
+ * Linux: there are dir/file/symlink and so on.
+ * NTFS: symlinks are "dir + reparse" or "file + reparse"
* It is good idea to create:
* dir + reparse if 'symname' points to directory
* or
default:
if (IsReparseTagMicrosoft(rp->ReparseTag)) {
- /* unknown Microsoft Tag */
+ /* Unknown Microsoft Tag. */
goto out;
}
if (!IsReparseTagNameSurrogate(rp->ReparseTag) ||
*/
struct lznt *get_lznt_ctx(int level)
{
- struct lznt *r = kzalloc(level ? offsetof(struct lznt, hash) :
- sizeof(struct lznt), GFP_NOFS);
+ struct lznt *r = kzalloc(level ? offsetof(struct lznt, hash)
+ : sizeof(struct lznt),
+ GFP_NOFS);
if (r)
r->std = !level;
RECORD_FLAG_UNKNOWN = cpu_to_le16(0x0008),
};
-/* MFT Record structure, */
+/* MFT Record structure. */
struct MFT_REC {
struct NTFS_RECORD_HEADER rhdr; // 'FILE'
u16 fs_fmask_inv;
u16 fs_dmask_inv;
- unsigned uid : 1, /* uid was set. */
- gid : 1, /* gid was set. */
- fmask : 1, /* fmask was set. */
- dmask : 1, /* dmask was set. */
- sys_immutable : 1,/* Immutable system files. */
- discard : 1, /* Issue discard requests on deletions. */
- sparse : 1, /* Create sparse files. */
- showmeta : 1, /* Show meta files. */
- nohidden : 1, /* Do not show hidden files. */
- force : 1, /* Rw mount dirty volume. */
- no_acs_rules : 1,/*Exclude acs rules. */
- prealloc : 1 /* Preallocate space when file is growing. */
+ unsigned uid : 1, /* uid was set. */
+ gid : 1, /* gid was set. */
+ fmask : 1, /* fmask was set. */
+ dmask : 1, /* dmask was set. */
+ sys_immutable : 1, /* Immutable system files. */
+ discard : 1, /* Issue discard requests on deletions. */
+ sparse : 1, /* Create sparse files. */
+ showmeta : 1, /* Show meta files. */
+ nohidden : 1, /* Do not show hidden files. */
+ force : 1, /* Rw mount dirty volume. */
+ no_acs_rules : 1, /*Exclude acs rules. */
+ prealloc : 1 /* Preallocate space when file is growing. */
;
};
asize = le32_to_cpu(attr->size);
if (asize < SIZEOF_RESIDENT) {
- /* Impossible 'cause we should not return such attribute */
+ /* Impossible 'cause we should not return such attribute. */
return NULL;
}
iput(inode);
- /* Load $LogFile to replay. */
+ /* Load LogFile to replay. */
ref.low = cpu_to_le32(MFT_REC_LOG);
ref.seq = cpu_to_le16(MFT_REC_LOG);
inode = ntfs_iget5(sb, &ref, &NAME_LOGFILE);
* - Case insensitive
* - If name equals and 'bothcases' then
* - Case sensitive
- * 'Straigth way' code scans input names twice in worst case.
+ * 'Straight way' code scans input names twice in worst case.
* Optimized code scans input names only once.
*/
int ntfs_cmp_names(const __le16 *s1, size_t l1, const __le16 *s2, size_t l2,
static inline size_t unpacked_ea_size(const struct EA_FULL *ea)
{
return ea->size ? le32_to_cpu(ea->size)
- : ALIGN(struct_size(
- ea, name,
- 1 + ea->name_len + le16_to_cpu(ea->elength)), 4);
+ : ALIGN(struct_size(ea, name,
+ 1 + ea->name_len +
+ le16_to_cpu(ea->elength)),
+ 4);
}
static inline size_t packed_ea_size(const struct EA_FULL *ea)