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);
537 ntfs_enter_cache(ni->vol->nidata_cache,
542 res = ntfs_inode_real_close(ni);
547 res = ntfs_inode_real_close(ni);
583 ntfs_inode *ni = NULL;
623 ni = (ntfs_inode*)NULL;
634 ni = extent_nis[i];
635 if (mft_no != ni->mft_no)
640 ni->mrec->sequence_number)) {
644 (long long)ni->mft_no);
651 ni = __ntfs_inode_allocate(base_ni->vol);
652 if (!ni)
654 if (ntfs_file_record_read(base_ni->vol, le64_to_cpu(mref), &ni->mrec, NULL))
656 ni->mft_no = mft_no;
657 ni->nr_extents = -1;
658 ni->base_ni = base_ni;
673 base_ni->extent_nis[base_ni->nr_extents++] = ni;
676 return ni;
678 __ntfs_inode_release(ni);
679 ni = NULL;
685 * @ni: opened ntfs inode for which perform attach
689 int ntfs_inode_attach_all_extents(ntfs_inode *ni)
694 if (!ni) {
700 if (ni->nr_extents == -1)
701 ni = ni->base_ni;
703 ntfs_log_trace("Entering for inode 0x%llx.\n", (long long) ni->mft_no);
706 if (!NInoAttrList(ni))
709 if (!ni->attr_list) {
717 ale = (ATTR_LIST_ENTRY *)ni->attr_list;
718 while ((u8*)ale < ni->attr_list + ni->attr_list_size) {
719 if (ni->mft_no != MREF_LE(ale->mft_reference) &&
721 if (!ntfs_extent_inode_open(ni, ale->mft_reference)) {
734 * @ni: ntfs inode to update standard information
738 static int ntfs_inode_sync_standard_information(ntfs_inode *ni)
745 ntfs_log_trace("Entering for inode %lld\n", (long long)ni->mft_no);
747 ctx = ntfs_attr_get_search_ctx(ni, NULL);
753 (long long)ni->mft_no);
759 std_info->file_attributes = ni->flags;
760 if (!test_nino_flag(ni, TimesSet)) {
761 std_info->creation_time = ni->creation_time;
762 std_info->last_data_change_time = ni->last_data_change_time;
763 std_info->last_mft_change_time = ni->last_mft_change_time;
764 std_info->last_access_time = ni->last_access_time;
771 if (test_nino_flag(ni, v3_Extensions)
776 std_info->owner_id = ni->owner_id;
777 std_info->security_id = ni->security_id;
778 std_info->quota_charged = ni->quota_charged;
779 std_info->usn = ni->usn;
788 * @ni: ntfs inode to update FILE_NAME attributes
790 * Update all FILE_NAME attributes for inode @ni in the index.
794 static int ntfs_inode_sync_file_name(ntfs_inode *ni, ntfs_inode *dir_ni)
805 ntfs_log_trace("Entering for inode %lld\n", (long long)ni->mft_no);
807 ctx = ntfs_attr_get_search_ctx(ni, NULL);
814 if (ni->flags & FILE_ATTR_REPARSE_POINT) {
827 if (MREF_LE(fn->parent_directory) == ni->mft_no) {
835 index_ni = ni;
840 index_ni = ntfs_inode_open(ni->vol,
855 if ((ni != index_ni) && !dir_ni
870 if (ni != index_ni && ntfs_inode_close(index_ni) && !err)
878 (ni->flags & FILE_ATTR_VALID_FLAGS);
879 if (ni->mrec->flags & MFT_RECORD_IS_DIRECTORY)
883 fnx->allocated_size = cpu_to_sle64(ni->allocated_size);
884 fnx->data_size = cpu_to_sle64(ni->data_size);
894 if (!test_nino_flag(ni, TimesSet)) {
895 fnx->creation_time = ni->creation_time;
896 fnx->last_data_change_time = ni->last_data_change_time;
897 fnx->last_mft_change_time = ni->last_mft_change_time;
898 fnx->last_access_time = ni->last_access_time;
907 if ((ni != index_ni) && !dir_ni
915 (long long)ni->mft_no);
933 * @ni: ntfs inode to write
935 * Write the inode @ni to disk as well as its dirty extent inodes if such
936 * exist and @ni is a base inode. If @ni is an extent inode, only @ni is
950 static int ntfs_inode_sync_in_dir(ntfs_inode *ni, ntfs_inode *dir_ni)
954 if (!ni) {
960 ntfs_log_enter("Entering for inode %lld\n", (long long)ni->mft_no);
963 if ((ni->mrec->flags & MFT_RECORD_IN_USE) && ni->nr_extents != -1 &&
964 ntfs_inode_sync_standard_information(ni)) {
973 if ((ni->mrec->flags & MFT_RECORD_IN_USE) && ni->nr_extents != -1 &&
974 NInoFileNameTestAndClearDirty(ni) &&
975 ntfs_inode_sync_file_name(ni, dir_ni)) {
982 (long long)ni->mft_no);
983 NInoFileNameSetDirty(ni);
987 if ((ni->mrec->flags & MFT_RECORD_IN_USE) && ni->nr_extents != -1 &&
988 NInoAttrList(ni) && NInoAttrListTestAndClearDirty(ni)) {
991 na = ntfs_attr_open(ni, AT_ATTRIBUTE_LIST, AT_UNNAMED, 0);
999 (long long)ni->mft_no);
1001 NInoAttrListSetDirty(ni);
1005 if (na->data_size == ni->attr_list_size) {
1006 if (ntfs_attr_pwrite(na, 0, ni->attr_list_size,
1007 ni->attr_list) != ni->attr_list_size) {
1014 (long long)ni->mft_no);
1016 NInoAttrListSetDirty(ni);
1021 "inode %lld)\n", (long long)ni->mft_no);
1022 NInoAttrListSetDirty(ni);
1029 if (NInoTestAndClearDirty(ni)) {
1030 if (ntfs_mft_record_write(ni->vol, ni->mft_no, ni->mrec)) {
1036 NInoSetDirty(ni);
1038 (long long)ni->mft_no);
1043 if (ni->nr_extents > 0) {
1046 for (i = 0; i < ni->nr_extents; ++i) {
1049 eni = ni->extent_nis[i];
1063 (long long)ni->mft_no,
1078 int ntfs_inode_sync(ntfs_inode *ni)
1080 return (ntfs_inode_sync_in_dir(ni, (ntfs_inode*)NULL));
1087 int ntfs_inode_close_in_dir(ntfs_inode *ni, ntfs_inode *dir_ni)
1091 res = ntfs_inode_sync_in_dir(ni, dir_ni);
1096 res = ntfs_inode_close(ni);
1102 * @ni: opened ntfs inode to which add attribute list
1111 int ntfs_inode_add_attrlist(ntfs_inode *ni)
1120 if (!ni) {
1126 ntfs_log_trace("inode %llu\n", (unsigned long long) ni->mft_no);
1128 if (NInoAttrList(ni) || ni->nr_extents) {
1135 ctx = ntfs_attr_get_search_ctx(ni, NULL);
1176 ale->mft_reference = MK_LE_MREF(ni->mft_no,
1177 le16_to_cpu(ni->mrec->sequence_number));
1188 __FUNCTION__, (long long)ni->mft_no);
1193 ni->attr_list = al;
1194 ni->attr_list_size = al_len;
1195 NInoSetAttrList(ni);
1196 NInoAttrListSetDirty(ni);
1199 if (le32_to_cpu(ni->mrec->bytes_allocated) -
1200 le32_to_cpu(ni->mrec->bytes_in_use) <
1202 if (ntfs_inode_free_space(ni,
1212 if (ntfs_resident_attr_record_add(ni,
1220 na = ntfs_attr_open(ni, AT_ATTRIBUTE_LIST, AT_UNNAMED, 0);
1239 ni->attr_list = NULL;
1240 NInoClearAttrList(ni);
1250 ni->attr_list = al;
1251 ni->attr_list_size = al_len;
1252 NInoSetAttrList(ni);
1261 if (MREF_LE(ale->mft_reference) != ni->mft_no) {
1267 if (ntfs_attr_record_move_to(ctx, ni))
1277 ni->attr_list = NULL;
1278 ni->attr_list_size = 0;
1279 NInoClearAttrList(ni);
1280 NInoAttrListClearDirty(ni);
1291 * @ni: ntfs inode in which MFT record needs more free space
1296 int ntfs_inode_free_space(ntfs_inode *ni, int size)
1301 if (!ni || size < 0) {
1303 ntfs_log_perror("%s: ni=%p size=%d", __FUNCTION__, ni, size);
1308 (unsigned long long)ni->mft_no, size);
1310 freed = (le32_to_cpu(ni->mrec->bytes_allocated) -
1311 le32_to_cpu(ni->mrec->bytes_in_use));
1316 ctx = ntfs_attr_get_search_ctx(ni, NULL);
1332 while (ctx->ntfs_ino->mft_no != ni->mft_no) {
1378 * @ni: ntfs inode for which update time fields
1384 void ntfs_inode_update_times(ntfs_inode *ni, ntfs_time_update_flags mask)
1388 if (!ni) {
1393 if ((ni->mft_no < FILE_first_user && ni->mft_no != FILE_root) ||
1394 NVolReadOnly(ni->vol) || !mask)
1399 ni->last_access_time = now;
1401 ni->last_data_change_time = now;
1403 ni->last_mft_change_time = now;
1405 NInoFileNameSetDirty(ni);
1406 NInoSetDirty(ni);
1463 int ntfs_inode_get_times(ntfs_inode *ni, char *value, size_t size)
1471 ctx = ntfs_attr_get_search_ctx(ni, NULL);
1476 (long long)ni->mft_no);
1521 int ntfs_inode_set_times(ntfs_inode *ni, const char *value, size_t size,
1539 ctx = ntfs_attr_get_search_ctx(ni, NULL);
1545 (long long)ni->mft_no);
1557 set_nino_flag(ni, TimesSet);
1559 ni->creation_time
1563 ni->last_data_change_time
1568 ni->last_access_time
1572 ni->last_mft_change_time = now;
1574 NInoFileNameSetDirty(ni);
1599 (long long)ni->mft_no);