@@ -556,3 +556,52 @@ void afs_edit_dir_update_dotdot(struct afs_vnode *vnode, struct afs_vnode *new_d
556556 0 , 0 , 0 , 0 , ".." );
557557 goto out ;
558558}
559+
560+ /*
561+ * Initialise a new directory. We need to fill in the "." and ".." entries.
562+ */
563+ void afs_mkdir_init_dir (struct afs_vnode * dvnode , struct afs_vnode * parent_dvnode )
564+ {
565+ union afs_xdr_dir_block * meta ;
566+ struct afs_dir_iter iter = { .dvnode = dvnode };
567+ union afs_xdr_dirent * de ;
568+ unsigned int slot = AFS_DIR_RESV_BLOCKS0 ;
569+ loff_t i_size ;
570+
571+ i_size = i_size_read (& dvnode -> netfs .inode );
572+ if (i_size != AFS_DIR_BLOCK_SIZE ) {
573+ afs_invalidate_dir (dvnode , afs_dir_invalid_edit_add_bad_size );
574+ return ;
575+ }
576+
577+ meta = afs_dir_get_block (& iter , 0 );
578+ if (!meta )
579+ return ;
580+
581+ afs_edit_init_block (meta , meta , 0 );
582+
583+ de = & meta -> dirents [slot ];
584+ de -> u .valid = 1 ;
585+ de -> u .vnode = htonl (dvnode -> fid .vnode );
586+ de -> u .unique = htonl (dvnode -> fid .unique );
587+ memcpy (de -> u .name , "." , 2 );
588+ trace_afs_edit_dir (dvnode , afs_edit_dir_for_mkdir , afs_edit_dir_mkdir , 0 , slot ,
589+ dvnode -> fid .vnode , dvnode -> fid .unique , "." );
590+ slot ++ ;
591+
592+ de = & meta -> dirents [slot ];
593+ de -> u .valid = 1 ;
594+ de -> u .vnode = htonl (parent_dvnode -> fid .vnode );
595+ de -> u .unique = htonl (parent_dvnode -> fid .unique );
596+ memcpy (de -> u .name , ".." , 3 );
597+ trace_afs_edit_dir (dvnode , afs_edit_dir_for_mkdir , afs_edit_dir_mkdir , 0 , slot ,
598+ parent_dvnode -> fid .vnode , parent_dvnode -> fid .unique , ".." );
599+
600+ afs_set_contig_bits (meta , AFS_DIR_RESV_BLOCKS0 , 2 );
601+ meta -> meta .alloc_ctrs [0 ] -= 2 ;
602+ kunmap_local (meta );
603+
604+ netfs_single_mark_inode_dirty (& dvnode -> netfs .inode );
605+ set_bit (AFS_VNODE_DIR_VALID , & dvnode -> flags );
606+ set_bit (AFS_VNODE_DIR_READ , & dvnode -> flags );
607+ }
0 commit comments