18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0 28c2ecf20Sopenharmony_ci/* 38c2ecf20Sopenharmony_ci * linux/fs/sysv/dir.c 48c2ecf20Sopenharmony_ci * 58c2ecf20Sopenharmony_ci * minix/dir.c 68c2ecf20Sopenharmony_ci * Copyright (C) 1991, 1992 Linus Torvalds 78c2ecf20Sopenharmony_ci * 88c2ecf20Sopenharmony_ci * coh/dir.c 98c2ecf20Sopenharmony_ci * Copyright (C) 1993 Pascal Haible, Bruno Haible 108c2ecf20Sopenharmony_ci * 118c2ecf20Sopenharmony_ci * sysv/dir.c 128c2ecf20Sopenharmony_ci * Copyright (C) 1993 Bruno Haible 138c2ecf20Sopenharmony_ci * 148c2ecf20Sopenharmony_ci * SystemV/Coherent directory handling functions 158c2ecf20Sopenharmony_ci */ 168c2ecf20Sopenharmony_ci 178c2ecf20Sopenharmony_ci#include <linux/pagemap.h> 188c2ecf20Sopenharmony_ci#include <linux/highmem.h> 198c2ecf20Sopenharmony_ci#include <linux/swap.h> 208c2ecf20Sopenharmony_ci#include "sysv.h" 218c2ecf20Sopenharmony_ci 228c2ecf20Sopenharmony_cistatic int sysv_readdir(struct file *, struct dir_context *); 238c2ecf20Sopenharmony_ci 248c2ecf20Sopenharmony_ciconst struct file_operations sysv_dir_operations = { 258c2ecf20Sopenharmony_ci .llseek = generic_file_llseek, 268c2ecf20Sopenharmony_ci .read = generic_read_dir, 278c2ecf20Sopenharmony_ci .iterate_shared = sysv_readdir, 288c2ecf20Sopenharmony_ci .fsync = generic_file_fsync, 298c2ecf20Sopenharmony_ci}; 308c2ecf20Sopenharmony_ci 318c2ecf20Sopenharmony_cistatic inline void dir_put_page(struct page *page) 328c2ecf20Sopenharmony_ci{ 338c2ecf20Sopenharmony_ci kunmap(page); 348c2ecf20Sopenharmony_ci put_page(page); 358c2ecf20Sopenharmony_ci} 368c2ecf20Sopenharmony_ci 378c2ecf20Sopenharmony_cistatic int dir_commit_chunk(struct page *page, loff_t pos, unsigned len) 388c2ecf20Sopenharmony_ci{ 398c2ecf20Sopenharmony_ci struct address_space *mapping = page->mapping; 408c2ecf20Sopenharmony_ci struct inode *dir = mapping->host; 418c2ecf20Sopenharmony_ci int err = 0; 428c2ecf20Sopenharmony_ci 438c2ecf20Sopenharmony_ci block_write_end(NULL, mapping, pos, len, len, page, NULL); 448c2ecf20Sopenharmony_ci if (pos+len > dir->i_size) { 458c2ecf20Sopenharmony_ci i_size_write(dir, pos+len); 468c2ecf20Sopenharmony_ci mark_inode_dirty(dir); 478c2ecf20Sopenharmony_ci } 488c2ecf20Sopenharmony_ci if (IS_DIRSYNC(dir)) 498c2ecf20Sopenharmony_ci err = write_one_page(page); 508c2ecf20Sopenharmony_ci else 518c2ecf20Sopenharmony_ci unlock_page(page); 528c2ecf20Sopenharmony_ci return err; 538c2ecf20Sopenharmony_ci} 548c2ecf20Sopenharmony_ci 558c2ecf20Sopenharmony_cistatic struct page * dir_get_page(struct inode *dir, unsigned long n) 568c2ecf20Sopenharmony_ci{ 578c2ecf20Sopenharmony_ci struct address_space *mapping = dir->i_mapping; 588c2ecf20Sopenharmony_ci struct page *page = read_mapping_page(mapping, n, NULL); 598c2ecf20Sopenharmony_ci if (!IS_ERR(page)) 608c2ecf20Sopenharmony_ci kmap(page); 618c2ecf20Sopenharmony_ci return page; 628c2ecf20Sopenharmony_ci} 638c2ecf20Sopenharmony_ci 648c2ecf20Sopenharmony_cistatic int sysv_readdir(struct file *file, struct dir_context *ctx) 658c2ecf20Sopenharmony_ci{ 668c2ecf20Sopenharmony_ci unsigned long pos = ctx->pos; 678c2ecf20Sopenharmony_ci struct inode *inode = file_inode(file); 688c2ecf20Sopenharmony_ci struct super_block *sb = inode->i_sb; 698c2ecf20Sopenharmony_ci unsigned long npages = dir_pages(inode); 708c2ecf20Sopenharmony_ci unsigned offset; 718c2ecf20Sopenharmony_ci unsigned long n; 728c2ecf20Sopenharmony_ci 738c2ecf20Sopenharmony_ci ctx->pos = pos = (pos + SYSV_DIRSIZE-1) & ~(SYSV_DIRSIZE-1); 748c2ecf20Sopenharmony_ci if (pos >= inode->i_size) 758c2ecf20Sopenharmony_ci return 0; 768c2ecf20Sopenharmony_ci 778c2ecf20Sopenharmony_ci offset = pos & ~PAGE_MASK; 788c2ecf20Sopenharmony_ci n = pos >> PAGE_SHIFT; 798c2ecf20Sopenharmony_ci 808c2ecf20Sopenharmony_ci for ( ; n < npages; n++, offset = 0) { 818c2ecf20Sopenharmony_ci char *kaddr, *limit; 828c2ecf20Sopenharmony_ci struct sysv_dir_entry *de; 838c2ecf20Sopenharmony_ci struct page *page = dir_get_page(inode, n); 848c2ecf20Sopenharmony_ci 858c2ecf20Sopenharmony_ci if (IS_ERR(page)) 868c2ecf20Sopenharmony_ci continue; 878c2ecf20Sopenharmony_ci kaddr = (char *)page_address(page); 888c2ecf20Sopenharmony_ci de = (struct sysv_dir_entry *)(kaddr+offset); 898c2ecf20Sopenharmony_ci limit = kaddr + PAGE_SIZE - SYSV_DIRSIZE; 908c2ecf20Sopenharmony_ci for ( ;(char*)de <= limit; de++, ctx->pos += sizeof(*de)) { 918c2ecf20Sopenharmony_ci char *name = de->name; 928c2ecf20Sopenharmony_ci 938c2ecf20Sopenharmony_ci if (!de->inode) 948c2ecf20Sopenharmony_ci continue; 958c2ecf20Sopenharmony_ci 968c2ecf20Sopenharmony_ci if (!dir_emit(ctx, name, strnlen(name,SYSV_NAMELEN), 978c2ecf20Sopenharmony_ci fs16_to_cpu(SYSV_SB(sb), de->inode), 988c2ecf20Sopenharmony_ci DT_UNKNOWN)) { 998c2ecf20Sopenharmony_ci dir_put_page(page); 1008c2ecf20Sopenharmony_ci return 0; 1018c2ecf20Sopenharmony_ci } 1028c2ecf20Sopenharmony_ci } 1038c2ecf20Sopenharmony_ci dir_put_page(page); 1048c2ecf20Sopenharmony_ci } 1058c2ecf20Sopenharmony_ci return 0; 1068c2ecf20Sopenharmony_ci} 1078c2ecf20Sopenharmony_ci 1088c2ecf20Sopenharmony_ci/* compare strings: name[0..len-1] (not zero-terminated) and 1098c2ecf20Sopenharmony_ci * buffer[0..] (filled with zeroes up to buffer[0..maxlen-1]) 1108c2ecf20Sopenharmony_ci */ 1118c2ecf20Sopenharmony_cistatic inline int namecompare(int len, int maxlen, 1128c2ecf20Sopenharmony_ci const char * name, const char * buffer) 1138c2ecf20Sopenharmony_ci{ 1148c2ecf20Sopenharmony_ci if (len < maxlen && buffer[len]) 1158c2ecf20Sopenharmony_ci return 0; 1168c2ecf20Sopenharmony_ci return !memcmp(name, buffer, len); 1178c2ecf20Sopenharmony_ci} 1188c2ecf20Sopenharmony_ci 1198c2ecf20Sopenharmony_ci/* 1208c2ecf20Sopenharmony_ci * sysv_find_entry() 1218c2ecf20Sopenharmony_ci * 1228c2ecf20Sopenharmony_ci * finds an entry in the specified directory with the wanted name. It 1238c2ecf20Sopenharmony_ci * returns the cache buffer in which the entry was found, and the entry 1248c2ecf20Sopenharmony_ci * itself (as a parameter - res_dir). It does NOT read the inode of the 1258c2ecf20Sopenharmony_ci * entry - you'll have to do that yourself if you want to. 1268c2ecf20Sopenharmony_ci */ 1278c2ecf20Sopenharmony_cistruct sysv_dir_entry *sysv_find_entry(struct dentry *dentry, struct page **res_page) 1288c2ecf20Sopenharmony_ci{ 1298c2ecf20Sopenharmony_ci const char * name = dentry->d_name.name; 1308c2ecf20Sopenharmony_ci int namelen = dentry->d_name.len; 1318c2ecf20Sopenharmony_ci struct inode * dir = d_inode(dentry->d_parent); 1328c2ecf20Sopenharmony_ci unsigned long start, n; 1338c2ecf20Sopenharmony_ci unsigned long npages = dir_pages(dir); 1348c2ecf20Sopenharmony_ci struct page *page = NULL; 1358c2ecf20Sopenharmony_ci struct sysv_dir_entry *de; 1368c2ecf20Sopenharmony_ci 1378c2ecf20Sopenharmony_ci *res_page = NULL; 1388c2ecf20Sopenharmony_ci 1398c2ecf20Sopenharmony_ci start = SYSV_I(dir)->i_dir_start_lookup; 1408c2ecf20Sopenharmony_ci if (start >= npages) 1418c2ecf20Sopenharmony_ci start = 0; 1428c2ecf20Sopenharmony_ci n = start; 1438c2ecf20Sopenharmony_ci 1448c2ecf20Sopenharmony_ci do { 1458c2ecf20Sopenharmony_ci char *kaddr; 1468c2ecf20Sopenharmony_ci page = dir_get_page(dir, n); 1478c2ecf20Sopenharmony_ci if (!IS_ERR(page)) { 1488c2ecf20Sopenharmony_ci kaddr = (char*)page_address(page); 1498c2ecf20Sopenharmony_ci de = (struct sysv_dir_entry *) kaddr; 1508c2ecf20Sopenharmony_ci kaddr += PAGE_SIZE - SYSV_DIRSIZE; 1518c2ecf20Sopenharmony_ci for ( ; (char *) de <= kaddr ; de++) { 1528c2ecf20Sopenharmony_ci if (!de->inode) 1538c2ecf20Sopenharmony_ci continue; 1548c2ecf20Sopenharmony_ci if (namecompare(namelen, SYSV_NAMELEN, 1558c2ecf20Sopenharmony_ci name, de->name)) 1568c2ecf20Sopenharmony_ci goto found; 1578c2ecf20Sopenharmony_ci } 1588c2ecf20Sopenharmony_ci dir_put_page(page); 1598c2ecf20Sopenharmony_ci } 1608c2ecf20Sopenharmony_ci 1618c2ecf20Sopenharmony_ci if (++n >= npages) 1628c2ecf20Sopenharmony_ci n = 0; 1638c2ecf20Sopenharmony_ci } while (n != start); 1648c2ecf20Sopenharmony_ci 1658c2ecf20Sopenharmony_ci return NULL; 1668c2ecf20Sopenharmony_ci 1678c2ecf20Sopenharmony_cifound: 1688c2ecf20Sopenharmony_ci SYSV_I(dir)->i_dir_start_lookup = n; 1698c2ecf20Sopenharmony_ci *res_page = page; 1708c2ecf20Sopenharmony_ci return de; 1718c2ecf20Sopenharmony_ci} 1728c2ecf20Sopenharmony_ci 1738c2ecf20Sopenharmony_ciint sysv_add_link(struct dentry *dentry, struct inode *inode) 1748c2ecf20Sopenharmony_ci{ 1758c2ecf20Sopenharmony_ci struct inode *dir = d_inode(dentry->d_parent); 1768c2ecf20Sopenharmony_ci const char * name = dentry->d_name.name; 1778c2ecf20Sopenharmony_ci int namelen = dentry->d_name.len; 1788c2ecf20Sopenharmony_ci struct page *page = NULL; 1798c2ecf20Sopenharmony_ci struct sysv_dir_entry * de; 1808c2ecf20Sopenharmony_ci unsigned long npages = dir_pages(dir); 1818c2ecf20Sopenharmony_ci unsigned long n; 1828c2ecf20Sopenharmony_ci char *kaddr; 1838c2ecf20Sopenharmony_ci loff_t pos; 1848c2ecf20Sopenharmony_ci int err; 1858c2ecf20Sopenharmony_ci 1868c2ecf20Sopenharmony_ci /* We take care of directory expansion in the same loop */ 1878c2ecf20Sopenharmony_ci for (n = 0; n <= npages; n++) { 1888c2ecf20Sopenharmony_ci page = dir_get_page(dir, n); 1898c2ecf20Sopenharmony_ci err = PTR_ERR(page); 1908c2ecf20Sopenharmony_ci if (IS_ERR(page)) 1918c2ecf20Sopenharmony_ci goto out; 1928c2ecf20Sopenharmony_ci kaddr = (char*)page_address(page); 1938c2ecf20Sopenharmony_ci de = (struct sysv_dir_entry *)kaddr; 1948c2ecf20Sopenharmony_ci kaddr += PAGE_SIZE - SYSV_DIRSIZE; 1958c2ecf20Sopenharmony_ci while ((char *)de <= kaddr) { 1968c2ecf20Sopenharmony_ci if (!de->inode) 1978c2ecf20Sopenharmony_ci goto got_it; 1988c2ecf20Sopenharmony_ci err = -EEXIST; 1998c2ecf20Sopenharmony_ci if (namecompare(namelen, SYSV_NAMELEN, name, de->name)) 2008c2ecf20Sopenharmony_ci goto out_page; 2018c2ecf20Sopenharmony_ci de++; 2028c2ecf20Sopenharmony_ci } 2038c2ecf20Sopenharmony_ci dir_put_page(page); 2048c2ecf20Sopenharmony_ci } 2058c2ecf20Sopenharmony_ci BUG(); 2068c2ecf20Sopenharmony_ci return -EINVAL; 2078c2ecf20Sopenharmony_ci 2088c2ecf20Sopenharmony_cigot_it: 2098c2ecf20Sopenharmony_ci pos = page_offset(page) + 2108c2ecf20Sopenharmony_ci (char*)de - (char*)page_address(page); 2118c2ecf20Sopenharmony_ci lock_page(page); 2128c2ecf20Sopenharmony_ci err = sysv_prepare_chunk(page, pos, SYSV_DIRSIZE); 2138c2ecf20Sopenharmony_ci if (err) 2148c2ecf20Sopenharmony_ci goto out_unlock; 2158c2ecf20Sopenharmony_ci memcpy (de->name, name, namelen); 2168c2ecf20Sopenharmony_ci memset (de->name + namelen, 0, SYSV_DIRSIZE - namelen - 2); 2178c2ecf20Sopenharmony_ci de->inode = cpu_to_fs16(SYSV_SB(inode->i_sb), inode->i_ino); 2188c2ecf20Sopenharmony_ci err = dir_commit_chunk(page, pos, SYSV_DIRSIZE); 2198c2ecf20Sopenharmony_ci dir->i_mtime = dir->i_ctime = current_time(dir); 2208c2ecf20Sopenharmony_ci mark_inode_dirty(dir); 2218c2ecf20Sopenharmony_ciout_page: 2228c2ecf20Sopenharmony_ci dir_put_page(page); 2238c2ecf20Sopenharmony_ciout: 2248c2ecf20Sopenharmony_ci return err; 2258c2ecf20Sopenharmony_ciout_unlock: 2268c2ecf20Sopenharmony_ci unlock_page(page); 2278c2ecf20Sopenharmony_ci goto out_page; 2288c2ecf20Sopenharmony_ci} 2298c2ecf20Sopenharmony_ci 2308c2ecf20Sopenharmony_ciint sysv_delete_entry(struct sysv_dir_entry *de, struct page *page) 2318c2ecf20Sopenharmony_ci{ 2328c2ecf20Sopenharmony_ci struct inode *inode = page->mapping->host; 2338c2ecf20Sopenharmony_ci char *kaddr = (char*)page_address(page); 2348c2ecf20Sopenharmony_ci loff_t pos = page_offset(page) + (char *)de - kaddr; 2358c2ecf20Sopenharmony_ci int err; 2368c2ecf20Sopenharmony_ci 2378c2ecf20Sopenharmony_ci lock_page(page); 2388c2ecf20Sopenharmony_ci err = sysv_prepare_chunk(page, pos, SYSV_DIRSIZE); 2398c2ecf20Sopenharmony_ci BUG_ON(err); 2408c2ecf20Sopenharmony_ci de->inode = 0; 2418c2ecf20Sopenharmony_ci err = dir_commit_chunk(page, pos, SYSV_DIRSIZE); 2428c2ecf20Sopenharmony_ci dir_put_page(page); 2438c2ecf20Sopenharmony_ci inode->i_ctime = inode->i_mtime = current_time(inode); 2448c2ecf20Sopenharmony_ci mark_inode_dirty(inode); 2458c2ecf20Sopenharmony_ci return err; 2468c2ecf20Sopenharmony_ci} 2478c2ecf20Sopenharmony_ci 2488c2ecf20Sopenharmony_ciint sysv_make_empty(struct inode *inode, struct inode *dir) 2498c2ecf20Sopenharmony_ci{ 2508c2ecf20Sopenharmony_ci struct page *page = grab_cache_page(inode->i_mapping, 0); 2518c2ecf20Sopenharmony_ci struct sysv_dir_entry * de; 2528c2ecf20Sopenharmony_ci char *base; 2538c2ecf20Sopenharmony_ci int err; 2548c2ecf20Sopenharmony_ci 2558c2ecf20Sopenharmony_ci if (!page) 2568c2ecf20Sopenharmony_ci return -ENOMEM; 2578c2ecf20Sopenharmony_ci err = sysv_prepare_chunk(page, 0, 2 * SYSV_DIRSIZE); 2588c2ecf20Sopenharmony_ci if (err) { 2598c2ecf20Sopenharmony_ci unlock_page(page); 2608c2ecf20Sopenharmony_ci goto fail; 2618c2ecf20Sopenharmony_ci } 2628c2ecf20Sopenharmony_ci kmap(page); 2638c2ecf20Sopenharmony_ci 2648c2ecf20Sopenharmony_ci base = (char*)page_address(page); 2658c2ecf20Sopenharmony_ci memset(base, 0, PAGE_SIZE); 2668c2ecf20Sopenharmony_ci 2678c2ecf20Sopenharmony_ci de = (struct sysv_dir_entry *) base; 2688c2ecf20Sopenharmony_ci de->inode = cpu_to_fs16(SYSV_SB(inode->i_sb), inode->i_ino); 2698c2ecf20Sopenharmony_ci strcpy(de->name,"."); 2708c2ecf20Sopenharmony_ci de++; 2718c2ecf20Sopenharmony_ci de->inode = cpu_to_fs16(SYSV_SB(inode->i_sb), dir->i_ino); 2728c2ecf20Sopenharmony_ci strcpy(de->name,".."); 2738c2ecf20Sopenharmony_ci 2748c2ecf20Sopenharmony_ci kunmap(page); 2758c2ecf20Sopenharmony_ci err = dir_commit_chunk(page, 0, 2 * SYSV_DIRSIZE); 2768c2ecf20Sopenharmony_cifail: 2778c2ecf20Sopenharmony_ci put_page(page); 2788c2ecf20Sopenharmony_ci return err; 2798c2ecf20Sopenharmony_ci} 2808c2ecf20Sopenharmony_ci 2818c2ecf20Sopenharmony_ci/* 2828c2ecf20Sopenharmony_ci * routine to check that the specified directory is empty (for rmdir) 2838c2ecf20Sopenharmony_ci */ 2848c2ecf20Sopenharmony_ciint sysv_empty_dir(struct inode * inode) 2858c2ecf20Sopenharmony_ci{ 2868c2ecf20Sopenharmony_ci struct super_block *sb = inode->i_sb; 2878c2ecf20Sopenharmony_ci struct page *page = NULL; 2888c2ecf20Sopenharmony_ci unsigned long i, npages = dir_pages(inode); 2898c2ecf20Sopenharmony_ci 2908c2ecf20Sopenharmony_ci for (i = 0; i < npages; i++) { 2918c2ecf20Sopenharmony_ci char *kaddr; 2928c2ecf20Sopenharmony_ci struct sysv_dir_entry * de; 2938c2ecf20Sopenharmony_ci page = dir_get_page(inode, i); 2948c2ecf20Sopenharmony_ci 2958c2ecf20Sopenharmony_ci if (IS_ERR(page)) 2968c2ecf20Sopenharmony_ci continue; 2978c2ecf20Sopenharmony_ci 2988c2ecf20Sopenharmony_ci kaddr = (char *)page_address(page); 2998c2ecf20Sopenharmony_ci de = (struct sysv_dir_entry *)kaddr; 3008c2ecf20Sopenharmony_ci kaddr += PAGE_SIZE-SYSV_DIRSIZE; 3018c2ecf20Sopenharmony_ci 3028c2ecf20Sopenharmony_ci for ( ;(char *)de <= kaddr; de++) { 3038c2ecf20Sopenharmony_ci if (!de->inode) 3048c2ecf20Sopenharmony_ci continue; 3058c2ecf20Sopenharmony_ci /* check for . and .. */ 3068c2ecf20Sopenharmony_ci if (de->name[0] != '.') 3078c2ecf20Sopenharmony_ci goto not_empty; 3088c2ecf20Sopenharmony_ci if (!de->name[1]) { 3098c2ecf20Sopenharmony_ci if (de->inode == cpu_to_fs16(SYSV_SB(sb), 3108c2ecf20Sopenharmony_ci inode->i_ino)) 3118c2ecf20Sopenharmony_ci continue; 3128c2ecf20Sopenharmony_ci goto not_empty; 3138c2ecf20Sopenharmony_ci } 3148c2ecf20Sopenharmony_ci if (de->name[1] != '.' || de->name[2]) 3158c2ecf20Sopenharmony_ci goto not_empty; 3168c2ecf20Sopenharmony_ci } 3178c2ecf20Sopenharmony_ci dir_put_page(page); 3188c2ecf20Sopenharmony_ci } 3198c2ecf20Sopenharmony_ci return 1; 3208c2ecf20Sopenharmony_ci 3218c2ecf20Sopenharmony_cinot_empty: 3228c2ecf20Sopenharmony_ci dir_put_page(page); 3238c2ecf20Sopenharmony_ci return 0; 3248c2ecf20Sopenharmony_ci} 3258c2ecf20Sopenharmony_ci 3268c2ecf20Sopenharmony_ci/* Releases the page */ 3278c2ecf20Sopenharmony_civoid sysv_set_link(struct sysv_dir_entry *de, struct page *page, 3288c2ecf20Sopenharmony_ci struct inode *inode) 3298c2ecf20Sopenharmony_ci{ 3308c2ecf20Sopenharmony_ci struct inode *dir = page->mapping->host; 3318c2ecf20Sopenharmony_ci loff_t pos = page_offset(page) + 3328c2ecf20Sopenharmony_ci (char *)de-(char*)page_address(page); 3338c2ecf20Sopenharmony_ci int err; 3348c2ecf20Sopenharmony_ci 3358c2ecf20Sopenharmony_ci lock_page(page); 3368c2ecf20Sopenharmony_ci err = sysv_prepare_chunk(page, pos, SYSV_DIRSIZE); 3378c2ecf20Sopenharmony_ci BUG_ON(err); 3388c2ecf20Sopenharmony_ci de->inode = cpu_to_fs16(SYSV_SB(inode->i_sb), inode->i_ino); 3398c2ecf20Sopenharmony_ci err = dir_commit_chunk(page, pos, SYSV_DIRSIZE); 3408c2ecf20Sopenharmony_ci dir_put_page(page); 3418c2ecf20Sopenharmony_ci dir->i_mtime = dir->i_ctime = current_time(dir); 3428c2ecf20Sopenharmony_ci mark_inode_dirty(dir); 3438c2ecf20Sopenharmony_ci} 3448c2ecf20Sopenharmony_ci 3458c2ecf20Sopenharmony_cistruct sysv_dir_entry * sysv_dotdot (struct inode *dir, struct page **p) 3468c2ecf20Sopenharmony_ci{ 3478c2ecf20Sopenharmony_ci struct page *page = dir_get_page(dir, 0); 3488c2ecf20Sopenharmony_ci struct sysv_dir_entry *de = NULL; 3498c2ecf20Sopenharmony_ci 3508c2ecf20Sopenharmony_ci if (!IS_ERR(page)) { 3518c2ecf20Sopenharmony_ci de = (struct sysv_dir_entry*) page_address(page) + 1; 3528c2ecf20Sopenharmony_ci *p = page; 3538c2ecf20Sopenharmony_ci } 3548c2ecf20Sopenharmony_ci return de; 3558c2ecf20Sopenharmony_ci} 3568c2ecf20Sopenharmony_ci 3578c2ecf20Sopenharmony_ciino_t sysv_inode_by_name(struct dentry *dentry) 3588c2ecf20Sopenharmony_ci{ 3598c2ecf20Sopenharmony_ci struct page *page; 3608c2ecf20Sopenharmony_ci struct sysv_dir_entry *de = sysv_find_entry (dentry, &page); 3618c2ecf20Sopenharmony_ci ino_t res = 0; 3628c2ecf20Sopenharmony_ci 3638c2ecf20Sopenharmony_ci if (de) { 3648c2ecf20Sopenharmony_ci res = fs16_to_cpu(SYSV_SB(dentry->d_sb), de->inode); 3658c2ecf20Sopenharmony_ci dir_put_page(page); 3668c2ecf20Sopenharmony_ci } 3678c2ecf20Sopenharmony_ci return res; 3688c2ecf20Sopenharmony_ci} 369