Lines Matching refs:ni

61 ntfs_inode *ntfs_inode_base(ntfs_inode *ni)
63 if (ni->nr_extents == -1)
64 return ni->base_ni;
65 return ni;
70 * @ni: ntfs inode to set dirty
72 * Set the inode @ni dirty so it is written out later (at the latest at
73 * ntfs_inode_close() time). If @ni is an extent inode, set the base inode
78 void ntfs_inode_mark_dirty(ntfs_inode *ni)
80 NInoSetDirty(ni);
81 if (ni->nr_extents == -1)
82 NInoSetDirty(ni->base_ni);
95 ntfs_inode *ni;
97 ni = (ntfs_inode*)ntfs_calloc(sizeof(ntfs_inode));
98 if (ni)
99 ni->vol = vol;
100 return ni;
118 * @ni:
124 static void __ntfs_inode_release(ntfs_inode *ni)
126 if (NInoDirty(ni))
128 (long long)ni->mft_no);
129 if (NInoAttrList(ni) && ni->attr_list)
130 free(ni->attr_list);
131 free(ni->mrec);
132 free(ni);
162 ntfs_inode *ni = NULL;
173 ni = __ntfs_inode_allocate(vol);
174 if (!ni)
176 if (ntfs_file_record_read(vol, mref, &ni->mrec, NULL))
178 if (!(ni->mrec->flags & MFT_RECORD_IN_USE)) {
182 ni->mft_no = MREF(mref);
183 ctx = ntfs_attr_get_search_ctx(ni, NULL);
189 if (!ni->mrec->base_mft_record)
196 ni->flags = std_info->file_attributes;
197 ni->creation_time = std_info->creation_time;
198 ni->last_data_change_time = std_info->last_data_change_time;
199 ni->last_mft_change_time = std_info->last_mft_change_time;
200 ni->last_access_time = std_info->last_access_time;
205 set_nino_flag(ni, v3_Extensions);
206 ni->owner_id = std_info->owner_id;
207 ni->security_id = std_info->security_id;
208 ni->quota_charged = std_info->quota_charged;
209 ni->usn = std_info->usn;
211 clear_nino_flag(ni, v3_Extensions);
212 ni->owner_id = const_cpu_to_le32(0);
213 ni->security_id = const_cpu_to_le32(0);
226 NInoSetAttrList(ni);
236 ni->attr_list_size = l;
237 ni->attr_list = ntfs_malloc(ni->attr_list_size);
238 if (!ni->attr_list)
240 l = ntfs_get_attribute_value(vol, ctx->attr, ni->attr_list);
243 if (l != ni->attr_list_size) {
246 "%lld", (long long)l, ni->attr_list_size,
258 ni->data_size = ni->allocated_size = 0;
261 ni->data_size = sle64_to_cpu(ctx->attr->data_size);
264 ni->allocated_size = sle64_to_cpu(
267 ni->allocated_size = sle64_to_cpu(
270 ni->data_size = le32_to_cpu(ctx->attr->value_length);
271 ni->allocated_size = (ni->data_size + 7) & ~7;
273 set_nino_flag(ni,KnownSize);
278 return ni;
283 __ntfs_inode_release(ni);
284 ni = NULL;
290 * @ni: ntfs inode to close
292 * Make sure the ntfs inode @ni is clean.
294 * If the ntfs inode @ni is a base inode, close all associated extent inodes,
304 * error, @ni has not been freed. The user should attempt to handle the error
307 * EBUSY @ni and/or its attribute list runlist is/are dirty and the
309 * EINVAL @ni is invalid (probably it is an extent inode).
313 int ntfs_inode_real_close(ntfs_inode *ni)
317 if (!ni)
320 ntfs_log_enter("Entering for inode %lld\n", (long long)ni->mft_no);
323 if (NInoDirty(ni) || NInoAttrListDirty(ni)) {
324 if (ntfs_inode_sync(ni)) {
331 if (ni->nr_extents > 0) {
332 while (ni->nr_extents > 0) {
333 if (ntfs_inode_real_close(ni->extent_nis[0])) {
339 } else if (ni->nr_extents == -1) {
348 base_ni = ni->base_ni;
351 if (tmp_nis[i] != ni)
388 (long long)ni->mft_no);
391 __ntfs_inode_release(ni);
407 ntfs_inode_real_close(((const struct CACHED_NIDATA*)cached)->ni);
442 item.ni = (ntfs_inode*)NULL;
463 ntfs_inode *ni;
476 ni = cached->ni;
481 ni = ntfs_inode_real_open(vol, mref);
483 if (!ni) {
487 ni = ntfs_inode_real_open(vol, mref);
489 return (ni);
502 int ntfs_inode_close(ntfs_inode *ni)
509 if (ni) {
510 debug_double_inode(ni->mft_no,0);
512 if (ni->vol && ni->vol->nidata_cache
513 && ((ni->mft_no == FILE_root)
514 || ((ni->mft_no >= FILE_first_user)
515 && !(ni->mrec->flags & MFT_RECORD_IS_4)))) {
517 dirty = NInoDirty(ni) || NInoAttrListDirty(ni);
519 res = ntfs_inode_sync(ni);
522 ntfs_inode_real_close(ni);
528 item.inum = ni->mft_no;
529 item.ni = ni;
532 debug_cached_inode(ni);
533 ntfs_enter_cache(ni->vol->nidata_cache,
538 res = ntfs_inode_real_close(ni);
543 res = ntfs_inode_real_close(ni);
579 ntfs_inode *ni = NULL;
619 ni = (ntfs_inode*)NULL;
630 ni = extent_nis[i];
631 if (mft_no != ni->mft_no)
636 ni->mrec->sequence_number)) {
640 (long long)ni->mft_no);
647 ni = __ntfs_inode_allocate(base_ni->vol);
648 if (!ni)
650 if (ntfs_file_record_read(base_ni->vol, le64_to_cpu(mref), &ni->mrec, NULL))
652 ni->mft_no = mft_no;
653 ni->nr_extents = -1;
654 ni->base_ni = base_ni;
669 base_ni->extent_nis[base_ni->nr_extents++] = ni;
672 return ni;
674 __ntfs_inode_release(ni);
675 ni = NULL;
681 * @ni: opened ntfs inode for which perform attach
685 int ntfs_inode_attach_all_extents(ntfs_inode *ni)
690 if (!ni) {
696 if (ni->nr_extents == -1)
697 ni = ni->base_ni;
699 ntfs_log_trace("Entering for inode 0x%llx.\n", (long long) ni->mft_no);
702 if (!NInoAttrList(ni))
705 if (!ni->attr_list) {
713 ale = (ATTR_LIST_ENTRY *)ni->attr_list;
714 while ((u8*)ale < ni->attr_list + ni->attr_list_size) {
715 if (ni->mft_no != MREF_LE(ale->mft_reference) &&
717 if (!ntfs_extent_inode_open(ni, ale->mft_reference)) {
730 * @ni: ntfs inode to update standard information
734 static int ntfs_inode_sync_standard_information(ntfs_inode *ni)
741 ntfs_log_trace("Entering for inode %lld\n", (long long)ni->mft_no);
743 ctx = ntfs_attr_get_search_ctx(ni, NULL);
749 (long long)ni->mft_no);
755 std_info->file_attributes = ni->flags;
756 if (!test_nino_flag(ni, TimesSet)) {
757 std_info->creation_time = ni->creation_time;
758 std_info->last_data_change_time = ni->last_data_change_time;
759 std_info->last_mft_change_time = ni->last_mft_change_time;
760 std_info->last_access_time = ni->last_access_time;
767 if (test_nino_flag(ni, v3_Extensions)
772 std_info->owner_id = ni->owner_id;
773 std_info->security_id = ni->security_id;
774 std_info->quota_charged = ni->quota_charged;
775 std_info->usn = ni->usn;
784 * @ni: ntfs inode to update FILE_NAME attributes
786 * Update all FILE_NAME attributes for inode @ni in the index.
790 static int ntfs_inode_sync_file_name(ntfs_inode *ni, ntfs_inode *dir_ni)
801 ntfs_log_trace("Entering for inode %lld\n", (long long)ni->mft_no);
803 ctx = ntfs_attr_get_search_ctx(ni, NULL);
810 if (ni->flags & FILE_ATTR_REPARSE_POINT) {
823 if (MREF_LE(fn->parent_directory) == ni->mft_no) {
831 index_ni = ni;
836 index_ni = ntfs_inode_open(ni->vol,
851 if ((ni != index_ni) && !dir_ni
866 if (ni != index_ni && ntfs_inode_close(index_ni) && !err)
874 (ni->flags & FILE_ATTR_VALID_FLAGS);
875 if (ni->mrec->flags & MFT_RECORD_IS_DIRECTORY)
879 fnx->allocated_size = cpu_to_sle64(ni->allocated_size);
880 fnx->data_size = cpu_to_sle64(ni->data_size);
890 if (!test_nino_flag(ni, TimesSet)) {
891 fnx->creation_time = ni->creation_time;
892 fnx->last_data_change_time = ni->last_data_change_time;
893 fnx->last_mft_change_time = ni->last_mft_change_time;
894 fnx->last_access_time = ni->last_access_time;
903 if ((ni != index_ni) && !dir_ni
911 (long long)ni->mft_no);
929 * @ni: ntfs inode to write
931 * Write the inode @ni to disk as well as its dirty extent inodes if such
932 * exist and @ni is a base inode. If @ni is an extent inode, only @ni is
946 static int ntfs_inode_sync_in_dir(ntfs_inode *ni, ntfs_inode *dir_ni)
950 if (!ni) {
956 ntfs_log_enter("Entering for inode %lld\n", (long long)ni->mft_no);
959 if ((ni->mrec->flags & MFT_RECORD_IN_USE) && ni->nr_extents != -1 &&
960 ntfs_inode_sync_standard_information(ni)) {
969 if ((ni->mrec->flags & MFT_RECORD_IN_USE) && ni->nr_extents != -1 &&
970 NInoFileNameTestAndClearDirty(ni) &&
971 ntfs_inode_sync_file_name(ni, dir_ni)) {
978 (long long)ni->mft_no);
979 NInoFileNameSetDirty(ni);
983 if ((ni->mrec->flags & MFT_RECORD_IN_USE) && ni->nr_extents != -1 &&
984 NInoAttrList(ni) && NInoAttrListTestAndClearDirty(ni)) {
987 na = ntfs_attr_open(ni, AT_ATTRIBUTE_LIST, AT_UNNAMED, 0);
995 (long long)ni->mft_no);
997 NInoAttrListSetDirty(ni);
1001 if (na->data_size == ni->attr_list_size) {
1002 if (ntfs_attr_pwrite(na, 0, ni->attr_list_size,
1003 ni->attr_list) != ni->attr_list_size) {
1010 (long long)ni->mft_no);
1012 NInoAttrListSetDirty(ni);
1017 "inode %lld)\n", (long long)ni->mft_no);
1018 NInoAttrListSetDirty(ni);
1025 if (NInoTestAndClearDirty(ni)) {
1026 if (ntfs_mft_record_write(ni->vol, ni->mft_no, ni->mrec)) {
1032 NInoSetDirty(ni);
1034 (long long)ni->mft_no);
1039 if (ni->nr_extents > 0) {
1042 for (i = 0; i < ni->nr_extents; ++i) {
1045 eni = ni->extent_nis[i];
1059 (long long)ni->mft_no,
1074 int ntfs_inode_sync(ntfs_inode *ni)
1076 return (ntfs_inode_sync_in_dir(ni, (ntfs_inode*)NULL));
1083 int ntfs_inode_close_in_dir(ntfs_inode *ni, ntfs_inode *dir_ni)
1087 res = ntfs_inode_sync_in_dir(ni, dir_ni);
1092 res = ntfs_inode_close(ni);
1098 * @ni: opened ntfs inode to which add attribute list
1107 int ntfs_inode_add_attrlist(ntfs_inode *ni)
1116 if (!ni) {
1122 ntfs_log_trace("inode %llu\n", (unsigned long long) ni->mft_no);
1124 if (NInoAttrList(ni) || ni->nr_extents) {
1131 ctx = ntfs_attr_get_search_ctx(ni, NULL);
1172 ale->mft_reference = MK_LE_MREF(ni->mft_no,
1173 le16_to_cpu(ni->mrec->sequence_number));
1184 __FUNCTION__, (long long)ni->mft_no);
1189 ni->attr_list = al;
1190 ni->attr_list_size = al_len;
1191 NInoSetAttrList(ni);
1192 NInoAttrListSetDirty(ni);
1195 if (le32_to_cpu(ni->mrec->bytes_allocated) -
1196 le32_to_cpu(ni->mrec->bytes_in_use) <
1198 if (ntfs_inode_free_space(ni,
1208 if (ntfs_resident_attr_record_add(ni,
1216 na = ntfs_attr_open(ni, AT_ATTRIBUTE_LIST, AT_UNNAMED, 0);
1235 ni->attr_list = NULL;
1236 NInoClearAttrList(ni);
1246 ni->attr_list = al;
1247 ni->attr_list_size = al_len;
1248 NInoSetAttrList(ni);
1257 if (MREF_LE(ale->mft_reference) != ni->mft_no) {
1263 if (ntfs_attr_record_move_to(ctx, ni))
1273 ni->attr_list = NULL;
1274 ni->attr_list_size = 0;
1275 NInoClearAttrList(ni);
1276 NInoAttrListClearDirty(ni);
1287 * @ni: ntfs inode in which MFT record needs more free space
1292 int ntfs_inode_free_space(ntfs_inode *ni, int size)
1297 if (!ni || size < 0) {
1299 ntfs_log_perror("%s: ni=%p size=%d", __FUNCTION__, ni, size);
1304 (unsigned long long)ni->mft_no, size);
1306 freed = (le32_to_cpu(ni->mrec->bytes_allocated) -
1307 le32_to_cpu(ni->mrec->bytes_in_use));
1312 ctx = ntfs_attr_get_search_ctx(ni, NULL);
1328 while (ctx->ntfs_ino->mft_no != ni->mft_no) {
1374 * @ni: ntfs inode for which update time fields
1380 void ntfs_inode_update_times(ntfs_inode *ni, ntfs_time_update_flags mask)
1384 if (!ni) {
1389 if ((ni->mft_no < FILE_first_user && ni->mft_no != FILE_root) ||
1390 NVolReadOnly(ni->vol) || !mask)
1395 ni->last_access_time = now;
1397 ni->last_data_change_time = now;
1399 ni->last_mft_change_time = now;
1401 NInoFileNameSetDirty(ni);
1402 NInoSetDirty(ni);
1461 int ntfs_inode_get_times(ntfs_inode *ni, char *value, size_t size)
1469 ctx = ntfs_attr_get_search_ctx(ni, NULL);
1474 (long long)ni->mft_no);
1519 int ntfs_inode_set_times(ntfs_inode *ni, const char *value, size_t size,
1535 ctx = ntfs_attr_get_search_ctx(ni, NULL);
1541 (long long)ni->mft_no);
1553 set_nino_flag(ni, TimesSet);
1555 ni->creation_time
1559 ni->last_data_change_time
1564 ni->last_access_time
1568 ni->last_mft_change_time = now;
1570 NInoFileNameSetDirty(ni);
1595 (long long)ni->mft_no);