Lines Matching refs:ni

59 ntfs_inode *ntfs_inode_base(ntfs_inode *ni)
61 if (ni->nr_extents == -1)
62 return ni->base_ni;
63 return ni;
68 * @ni: ntfs inode to set dirty
70 * Set the inode @ni dirty so it is written out later (at the latest at
71 * ntfs_inode_close() time). If @ni is an extent inode, set the base inode
76 void ntfs_inode_mark_dirty(ntfs_inode *ni)
78 NInoSetDirty(ni);
79 if (ni->nr_extents == -1)
80 NInoSetDirty(ni->base_ni);
93 ntfs_inode *ni;
95 ni = (ntfs_inode*)ntfs_calloc(sizeof(ntfs_inode));
96 if (ni)
97 ni->vol = vol;
98 return ni;
116 * @ni:
122 static void __ntfs_inode_release(ntfs_inode *ni)
124 if (NInoDirty(ni))
126 (long long)ni->mft_no);
127 if (NInoAttrList(ni) && ni->attr_list)
128 free(ni->attr_list);
129 free(ni->mrec);
130 free(ni);
160 ntfs_inode *ni = NULL;
171 ni = __ntfs_inode_allocate(vol);
172 if (!ni)
174 if (ntfs_file_record_read(vol, mref, &ni->mrec, NULL))
176 if (!(ni->mrec->flags & MFT_RECORD_IN_USE)) {
180 ni->mft_no = MREF(mref);
181 ctx = ntfs_attr_get_search_ctx(ni, NULL);
187 if (!ni->mrec->base_mft_record)
201 ni->flags = std_info->file_attributes;
202 ni->creation_time = std_info->creation_time;
203 ni->last_data_change_time = std_info->last_data_change_time;
204 ni->last_mft_change_time = std_info->last_mft_change_time;
205 ni->last_access_time = std_info->last_access_time;
209 set_nino_flag(ni, v3_Extensions);
210 ni->owner_id = std_info->owner_id;
211 ni->security_id = std_info->security_id;
212 ni->quota_charged = std_info->quota_charged;
213 ni->usn = std_info->usn;
215 clear_nino_flag(ni, v3_Extensions);
216 ni->owner_id = const_cpu_to_le32(0);
217 ni->security_id = const_cpu_to_le32(0);
230 NInoSetAttrList(ni);
240 ni->attr_list_size = l;
241 ni->attr_list = ntfs_malloc(ni->attr_list_size);
242 if (!ni->attr_list)
244 l = ntfs_get_attribute_value(vol, ctx->attr, ni->attr_list);
247 if (l != ni->attr_list_size) {
250 "%lld", (long long)l, ni->attr_list_size,
262 ni->data_size = ni->allocated_size = 0;
265 ni->data_size = sle64_to_cpu(ctx->attr->data_size);
268 ni->allocated_size = sle64_to_cpu(
271 ni->allocated_size = sle64_to_cpu(
274 ni->data_size = le32_to_cpu(ctx->attr->value_length);
275 ni->allocated_size = (ni->data_size + 7) & ~7;
277 set_nino_flag(ni,KnownSize);
282 return ni;
287 __ntfs_inode_release(ni);
288 ni = NULL;
294 * @ni: ntfs inode to close
296 * Make sure the ntfs inode @ni is clean.
298 * If the ntfs inode @ni is a base inode, close all associated extent inodes,
308 * error, @ni has not been freed. The user should attempt to handle the error
311 * EBUSY @ni and/or its attribute list runlist is/are dirty and the
313 * EINVAL @ni is invalid (probably it is an extent inode).
317 int ntfs_inode_real_close(ntfs_inode *ni)
321 if (!ni)
324 ntfs_log_enter("Entering for inode %lld\n", (long long)ni->mft_no);
327 if (NInoDirty(ni) || NInoAttrListDirty(ni)) {
328 if (ntfs_inode_sync(ni)) {
335 if (ni->nr_extents > 0) {
336 while (ni->nr_extents > 0) {
337 if (ntfs_inode_real_close(ni->extent_nis[0])) {
343 } else if (ni->nr_extents == -1) {
352 base_ni = ni->base_ni;
355 if (tmp_nis[i] != ni)
392 (long long)ni->mft_no);
395 __ntfs_inode_release(ni);
411 ntfs_inode_real_close(((const struct CACHED_NIDATA*)cached)->ni);
446 item.ni = (ntfs_inode*)NULL;
467 ntfs_inode *ni;
480 ni = cached->ni;
485 ni = ntfs_inode_real_open(vol, mref);
487 if (!ni) {
491 ni = ntfs_inode_real_open(vol, mref);
493 return (ni);
506 int ntfs_inode_close(ntfs_inode *ni)
513 if (ni) {
514 debug_double_inode(ni->mft_no,0);
516 if (ni->vol && ni->vol->nidata_cache
517 && ((ni->mft_no == FILE_root)
518 || ((ni->mft_no >= FILE_first_user)
519 && !(ni->mrec->flags & MFT_RECORD_IS_4)))) {
521 dirty = NInoDirty(ni) || NInoAttrListDirty(ni);
523 res = ntfs_inode_sync(ni);
526 ntfs_inode_real_close(ni);
532 item.inum = ni->mft_no;
533 item.ni = ni;
536 debug_cached_inode(ni);
538 if (ntfs_fetch_cache(ni->vol->nidata_cache,
540 panic("ntfs_inode_close: %llu already in cache!", ni->mft_no);
543 ntfs_enter_cache(ni->vol->nidata_cache,
548 res = ntfs_inode_real_close(ni);
553 res = ntfs_inode_real_close(ni);
589 ntfs_inode *ni = NULL;
629 ni = (ntfs_inode*)NULL;
640 ni = extent_nis[i];
641 if (mft_no != ni->mft_no)
646 ni->mrec->sequence_number)) {
650 (long long)ni->mft_no);
657 ni = __ntfs_inode_allocate(base_ni->vol);
658 if (!ni)
660 if (ntfs_file_record_read(base_ni->vol, le64_to_cpu(mref), &ni->mrec, NULL))
662 ni->mft_no = mft_no;
663 ni->nr_extents = -1;
664 ni->base_ni = base_ni;
679 base_ni->extent_nis[base_ni->nr_extents++] = ni;
682 return ni;
684 __ntfs_inode_release(ni);
685 ni = NULL;
691 * @ni: opened ntfs inode for which perform attach
695 int ntfs_inode_attach_all_extents(ntfs_inode *ni)
700 if (!ni) {
706 if (ni->nr_extents == -1)
707 ni = ni->base_ni;
709 ntfs_log_trace("Entering for inode 0x%llx.\n", (long long) ni->mft_no);
712 if (!NInoAttrList(ni))
715 if (!ni->attr_list) {
723 ale = (ATTR_LIST_ENTRY *)ni->attr_list;
724 while ((u8*)ale < ni->attr_list + ni->attr_list_size) {
725 if (ni->mft_no != MREF_LE(ale->mft_reference) &&
727 if (!ntfs_extent_inode_open(ni, ale->mft_reference)) {
740 * @ni: ntfs inode to update standard information
744 static int ntfs_inode_sync_standard_information(ntfs_inode *ni)
751 ntfs_log_trace("Entering for inode %lld\n", (long long)ni->mft_no);
753 ctx = ntfs_attr_get_search_ctx(ni, NULL);
759 (long long)ni->mft_no);
765 std_info->file_attributes = ni->flags;
766 if (!test_nino_flag(ni, TimesSet)) {
767 std_info->creation_time = ni->creation_time;
768 std_info->last_data_change_time = ni->last_data_change_time;
769 std_info->last_mft_change_time = ni->last_mft_change_time;
770 std_info->last_access_time = ni->last_access_time;
777 if (test_nino_flag(ni, v3_Extensions)
782 std_info->owner_id = ni->owner_id;
783 std_info->security_id = ni->security_id;
784 std_info->quota_charged = ni->quota_charged;
785 std_info->usn = ni->usn;
794 * @ni: ntfs inode to update FILE_NAME attributes
796 * Update all FILE_NAME attributes for inode @ni in the index.
800 static int ntfs_inode_sync_file_name(ntfs_inode *ni, ntfs_inode *dir_ni)
811 ntfs_log_trace("Entering for inode %lld\n", (long long)ni->mft_no);
813 ctx = ntfs_attr_get_search_ctx(ni, NULL);
820 if (ni->flags & FILE_ATTR_REPARSE_POINT) {
833 if (MREF_LE(fn->parent_directory) == ni->mft_no) {
841 index_ni = ni;
846 index_ni = ntfs_inode_open(ni->vol,
861 if ((ni != index_ni) && !dir_ni
876 if (ni != index_ni && ntfs_inode_close(index_ni) && !err)
884 (ni->flags & FILE_ATTR_VALID_FLAGS);
885 if (ni->mrec->flags & MFT_RECORD_IS_DIRECTORY)
889 fnx->allocated_size = cpu_to_sle64(ni->allocated_size);
890 fnx->data_size = cpu_to_sle64(ni->data_size);
900 if (!test_nino_flag(ni, TimesSet)) {
901 fnx->creation_time = ni->creation_time;
902 fnx->last_data_change_time = ni->last_data_change_time;
903 fnx->last_mft_change_time = ni->last_mft_change_time;
904 fnx->last_access_time = ni->last_access_time;
913 if ((ni != index_ni) && !dir_ni
921 (long long)ni->mft_no);
939 * @ni: ntfs inode to write
941 * Write the inode @ni to disk as well as its dirty extent inodes if such
942 * exist and @ni is a base inode. If @ni is an extent inode, only @ni is
956 static int ntfs_inode_sync_in_dir(ntfs_inode *ni, ntfs_inode *dir_ni)
960 if (!ni) {
966 ntfs_log_enter("Entering for inode %lld\n", (long long)ni->mft_no);
969 if ((ni->mrec->flags & MFT_RECORD_IN_USE) && ni->nr_extents != -1 &&
970 ntfs_inode_sync_standard_information(ni)) {
979 if ((ni->mrec->flags & MFT_RECORD_IN_USE) && ni->nr_extents != -1 &&
980 NInoFileNameTestAndClearDirty(ni) &&
981 ntfs_inode_sync_file_name(ni, dir_ni)) {
988 (long long)ni->mft_no);
989 NInoFileNameSetDirty(ni);
993 if ((ni->mrec->flags & MFT_RECORD_IN_USE) && ni->nr_extents != -1 &&
994 NInoAttrList(ni) && NInoAttrListTestAndClearDirty(ni)) {
997 na = ntfs_attr_open(ni, AT_ATTRIBUTE_LIST, AT_UNNAMED, 0);
1005 (long long)ni->mft_no);
1007 NInoAttrListSetDirty(ni);
1011 if (na->data_size == ni->attr_list_size) {
1012 if (ntfs_attr_pwrite(na, 0, ni->attr_list_size,
1013 ni->attr_list) != ni->attr_list_size) {
1020 (long long)ni->mft_no);
1022 NInoAttrListSetDirty(ni);
1027 "inode %lld)\n", (long long)ni->mft_no);
1028 NInoAttrListSetDirty(ni);
1035 if (NInoTestAndClearDirty(ni)) {
1036 if (ntfs_mft_record_write(ni->vol, ni->mft_no, ni->mrec)) {
1042 NInoSetDirty(ni);
1044 (long long)ni->mft_no);
1049 if (ni->nr_extents > 0) {
1052 for (i = 0; i < ni->nr_extents; ++i) {
1055 eni = ni->extent_nis[i];
1069 (long long)ni->mft_no,
1084 int ntfs_inode_sync(ntfs_inode *ni)
1086 return (ntfs_inode_sync_in_dir(ni, (ntfs_inode*)NULL));
1093 int ntfs_inode_close_in_dir(ntfs_inode *ni, ntfs_inode *dir_ni)
1097 res = ntfs_inode_sync_in_dir(ni, dir_ni);
1102 res = ntfs_inode_close(ni);
1108 * @ni: opened ntfs inode to which add attribute list
1117 int ntfs_inode_add_attrlist(ntfs_inode *ni)
1126 if (!ni) {
1132 ntfs_log_trace("inode %llu\n", (unsigned long long) ni->mft_no);
1134 if (NInoAttrList(ni) || ni->nr_extents) {
1141 ctx = ntfs_attr_get_search_ctx(ni, NULL);
1182 ale->mft_reference = MK_LE_MREF(ni->mft_no,
1183 le16_to_cpu(ni->mrec->sequence_number));
1194 __FUNCTION__, (long long)ni->mft_no);
1199 ni->attr_list = al;
1200 ni->attr_list_size = al_len;
1201 NInoSetAttrList(ni);
1202 NInoAttrListSetDirty(ni);
1205 if (le32_to_cpu(ni->mrec->bytes_allocated) -
1206 le32_to_cpu(ni->mrec->bytes_in_use) <
1208 if (ntfs_inode_free_space(ni,
1218 if (ntfs_resident_attr_record_add(ni,
1226 na = ntfs_attr_open(ni, AT_ATTRIBUTE_LIST, AT_UNNAMED, 0);
1245 ni->attr_list = NULL;
1246 NInoClearAttrList(ni);
1256 ni->attr_list = al;
1257 ni->attr_list_size = al_len;
1258 NInoSetAttrList(ni);
1267 if (MREF_LE(ale->mft_reference) != ni->mft_no) {
1273 if (ntfs_attr_record_move_to(ctx, ni))
1283 ni->attr_list = NULL;
1284 ni->attr_list_size = 0;
1285 NInoClearAttrList(ni);
1286 NInoAttrListClearDirty(ni);
1297 * @ni: ntfs inode in which MFT record needs more free space
1302 int ntfs_inode_free_space(ntfs_inode *ni, int size)
1307 if (!ni || size < 0) {
1309 ntfs_log_perror("%s: ni=%p size=%d", __FUNCTION__, ni, size);
1314 (unsigned long long)ni->mft_no, size);
1316 freed = (le32_to_cpu(ni->mrec->bytes_allocated) -
1317 le32_to_cpu(ni->mrec->bytes_in_use));
1322 ctx = ntfs_attr_get_search_ctx(ni, NULL);
1338 while (ctx->ntfs_ino->mft_no != ni->mft_no) {
1384 * @ni: ntfs inode for which update time fields
1390 void ntfs_inode_update_times(ntfs_inode *ni, ntfs_time_update_flags mask)
1394 if (!ni) {
1399 if ((ni->mft_no < FILE_first_user && ni->mft_no != FILE_root) ||
1400 NVolReadOnly(ni->vol) || !mask)
1405 ni->last_access_time = now;
1407 ni->last_data_change_time = now;
1409 ni->last_mft_change_time = now;
1411 NInoFileNameSetDirty(ni);
1412 NInoSetDirty(ni);
1469 int ntfs_inode_get_times(ntfs_inode *ni, char *value, size_t size)
1477 ctx = ntfs_attr_get_search_ctx(ni, NULL);
1482 (long long)ni->mft_no);
1527 int ntfs_inode_set_times(ntfs_inode *ni, const char *value, size_t size,
1545 ctx = ntfs_attr_get_search_ctx(ni, NULL);
1551 (long long)ni->mft_no);
1563 set_nino_flag(ni, TimesSet);
1565 ni->creation_time
1569 ni->last_data_change_time
1574 ni->last_access_time
1578 ni->last_mft_change_time = now;
1580 NInoFileNameSetDirty(ni);
1605 (long long)ni->mft_no);