1d2912cb1SThomas Gleixner // SPDX-License-Identifier: GPL-2.0-only
21da177e4SLinus Torvalds /*
31da177e4SLinus Torvalds * linux/fs/adfs/inode.c
41da177e4SLinus Torvalds *
51da177e4SLinus Torvalds * Copyright (C) 1997-1999 Russell King
61da177e4SLinus Torvalds */
71da177e4SLinus Torvalds #include <linux/buffer_head.h>
8a9185b41SChristoph Hellwig #include <linux/writeback.h>
91da177e4SLinus Torvalds #include "adfs.h"
101da177e4SLinus Torvalds
111da177e4SLinus Torvalds /*
121da177e4SLinus Torvalds * Lookup/Create a block at offset 'block' into 'inode'. We currently do
131da177e4SLinus Torvalds * not support creation of new blocks, so we return -EIO for this case.
141da177e4SLinus Torvalds */
151da177e4SLinus Torvalds static int
adfs_get_block(struct inode * inode,sector_t block,struct buffer_head * bh,int create)161da177e4SLinus Torvalds adfs_get_block(struct inode *inode, sector_t block, struct buffer_head *bh,
171da177e4SLinus Torvalds int create)
181da177e4SLinus Torvalds {
191da177e4SLinus Torvalds if (!create) {
201da177e4SLinus Torvalds if (block >= inode->i_blocks)
211da177e4SLinus Torvalds goto abort_toobig;
221da177e4SLinus Torvalds
2325e5d4dfSRussell King block = __adfs_block_map(inode->i_sb, ADFS_I(inode)->indaddr,
2425e5d4dfSRussell King block);
251da177e4SLinus Torvalds if (block)
261da177e4SLinus Torvalds map_bh(bh, inode->i_sb, block);
271da177e4SLinus Torvalds return 0;
281da177e4SLinus Torvalds }
291da177e4SLinus Torvalds /* don't support allocation of blocks yet */
301da177e4SLinus Torvalds return -EIO;
311da177e4SLinus Torvalds
321da177e4SLinus Torvalds abort_toobig:
331da177e4SLinus Torvalds return 0;
341da177e4SLinus Torvalds }
351da177e4SLinus Torvalds
adfs_writepage(struct page * page,struct writeback_control * wbc)361da177e4SLinus Torvalds static int adfs_writepage(struct page *page, struct writeback_control *wbc)
371da177e4SLinus Torvalds {
381da177e4SLinus Torvalds return block_write_full_page(page, adfs_get_block, wbc);
391da177e4SLinus Torvalds }
401da177e4SLinus Torvalds
adfs_read_folio(struct file * file,struct folio * folio)412c69e205SMatthew Wilcox (Oracle) static int adfs_read_folio(struct file *file, struct folio *folio)
421da177e4SLinus Torvalds {
432c69e205SMatthew Wilcox (Oracle) return block_read_full_folio(folio, adfs_get_block);
441da177e4SLinus Torvalds }
451da177e4SLinus Torvalds
adfs_write_failed(struct address_space * mapping,loff_t to)4662295183SMarco Stornelli static void adfs_write_failed(struct address_space *mapping, loff_t to)
4762295183SMarco Stornelli {
4862295183SMarco Stornelli struct inode *inode = mapping->host;
4962295183SMarco Stornelli
5062295183SMarco Stornelli if (to > inode->i_size)
517caef267SKirill A. Shutemov truncate_pagecache(inode, inode->i_size);
5262295183SMarco Stornelli }
5362295183SMarco Stornelli
adfs_write_begin(struct file * file,struct address_space * mapping,loff_t pos,unsigned len,struct page ** pagep,void ** fsdata)54b4585729SNick Piggin static int adfs_write_begin(struct file *file, struct address_space *mapping,
559d6b0cd7SMatthew Wilcox (Oracle) loff_t pos, unsigned len,
56b4585729SNick Piggin struct page **pagep, void **fsdata)
571da177e4SLinus Torvalds {
58282dc178SChristoph Hellwig int ret;
59282dc178SChristoph Hellwig
60b4585729SNick Piggin *pagep = NULL;
61be3bbbc5SMatthew Wilcox (Oracle) ret = cont_write_begin(file, mapping, pos, len, pagep, fsdata,
62b4585729SNick Piggin adfs_get_block,
63b4585729SNick Piggin &ADFS_I(mapping->host)->mmu_private);
6462295183SMarco Stornelli if (unlikely(ret))
6562295183SMarco Stornelli adfs_write_failed(mapping, pos + len);
66282dc178SChristoph Hellwig
67282dc178SChristoph Hellwig return ret;
681da177e4SLinus Torvalds }
691da177e4SLinus Torvalds
_adfs_bmap(struct address_space * mapping,sector_t block)701da177e4SLinus Torvalds static sector_t _adfs_bmap(struct address_space *mapping, sector_t block)
711da177e4SLinus Torvalds {
721da177e4SLinus Torvalds return generic_block_bmap(mapping, block, adfs_get_block);
731da177e4SLinus Torvalds }
741da177e4SLinus Torvalds
75f5e54d6eSChristoph Hellwig static const struct address_space_operations adfs_aops = {
76e621900aSMatthew Wilcox (Oracle) .dirty_folio = block_dirty_folio,
777ba13abbSMatthew Wilcox (Oracle) .invalidate_folio = block_invalidate_folio,
782c69e205SMatthew Wilcox (Oracle) .read_folio = adfs_read_folio,
791da177e4SLinus Torvalds .writepage = adfs_writepage,
80b4585729SNick Piggin .write_begin = adfs_write_begin,
81b4585729SNick Piggin .write_end = generic_write_end,
821da177e4SLinus Torvalds .bmap = _adfs_bmap
831da177e4SLinus Torvalds };
841da177e4SLinus Torvalds
851da177e4SLinus Torvalds /*
861da177e4SLinus Torvalds * Convert ADFS attributes and filetype to Linux permission.
871da177e4SLinus Torvalds */
881da177e4SLinus Torvalds static umode_t
adfs_atts2mode(struct super_block * sb,struct inode * inode)891da177e4SLinus Torvalds adfs_atts2mode(struct super_block *sb, struct inode *inode)
901da177e4SLinus Torvalds {
91da23ef05SStuart Swales unsigned int attr = ADFS_I(inode)->attr;
921da177e4SLinus Torvalds umode_t mode, rmask;
931da177e4SLinus Torvalds struct adfs_sb_info *asb = ADFS_SB(sb);
941da177e4SLinus Torvalds
951da177e4SLinus Torvalds if (attr & ADFS_NDA_DIRECTORY) {
961da177e4SLinus Torvalds mode = S_IRUGO & asb->s_owner_mask;
971da177e4SLinus Torvalds return S_IFDIR | S_IXUGO | mode;
981da177e4SLinus Torvalds }
991da177e4SLinus Torvalds
100b4ed8f75SRussell King switch (adfs_filetype(ADFS_I(inode)->loadaddr)) {
1011da177e4SLinus Torvalds case 0xfc0: /* LinkFS */
1021da177e4SLinus Torvalds return S_IFLNK|S_IRWXUGO;
1031da177e4SLinus Torvalds
1041da177e4SLinus Torvalds case 0xfe6: /* UnixExec */
1051da177e4SLinus Torvalds rmask = S_IRUGO | S_IXUGO;
1061da177e4SLinus Torvalds break;
1071da177e4SLinus Torvalds
1081da177e4SLinus Torvalds default:
1091da177e4SLinus Torvalds rmask = S_IRUGO;
1101da177e4SLinus Torvalds }
1111da177e4SLinus Torvalds
1121da177e4SLinus Torvalds mode = S_IFREG;
1131da177e4SLinus Torvalds
1141da177e4SLinus Torvalds if (attr & ADFS_NDA_OWNER_READ)
1151da177e4SLinus Torvalds mode |= rmask & asb->s_owner_mask;
1161da177e4SLinus Torvalds
1171da177e4SLinus Torvalds if (attr & ADFS_NDA_OWNER_WRITE)
1181da177e4SLinus Torvalds mode |= S_IWUGO & asb->s_owner_mask;
1191da177e4SLinus Torvalds
1201da177e4SLinus Torvalds if (attr & ADFS_NDA_PUBLIC_READ)
1211da177e4SLinus Torvalds mode |= rmask & asb->s_other_mask;
1221da177e4SLinus Torvalds
1231da177e4SLinus Torvalds if (attr & ADFS_NDA_PUBLIC_WRITE)
1241da177e4SLinus Torvalds mode |= S_IWUGO & asb->s_other_mask;
1251da177e4SLinus Torvalds return mode;
1261da177e4SLinus Torvalds }
1271da177e4SLinus Torvalds
1281da177e4SLinus Torvalds /*
1291da177e4SLinus Torvalds * Convert Linux permission to ADFS attribute. We try to do the reverse
1301da177e4SLinus Torvalds * of atts2mode, but there is not a 1:1 translation.
1311da177e4SLinus Torvalds */
adfs_mode2atts(struct super_block * sb,struct inode * inode,umode_t ia_mode)13281916245SRussell King static int adfs_mode2atts(struct super_block *sb, struct inode *inode,
13381916245SRussell King umode_t ia_mode)
1341da177e4SLinus Torvalds {
13581916245SRussell King struct adfs_sb_info *asb = ADFS_SB(sb);
1361da177e4SLinus Torvalds umode_t mode;
1371da177e4SLinus Torvalds int attr;
1381da177e4SLinus Torvalds
1391da177e4SLinus Torvalds /* FIXME: should we be able to alter a link? */
1401da177e4SLinus Torvalds if (S_ISLNK(inode->i_mode))
1411da177e4SLinus Torvalds return ADFS_I(inode)->attr;
1421da177e4SLinus Torvalds
14381916245SRussell King /* Directories do not have read/write permissions on the media */
1441da177e4SLinus Torvalds if (S_ISDIR(inode->i_mode))
14581916245SRussell King return ADFS_NDA_DIRECTORY;
1461da177e4SLinus Torvalds
14781916245SRussell King attr = 0;
14881916245SRussell King mode = ia_mode & asb->s_owner_mask;
1491da177e4SLinus Torvalds if (mode & S_IRUGO)
1501da177e4SLinus Torvalds attr |= ADFS_NDA_OWNER_READ;
1511da177e4SLinus Torvalds if (mode & S_IWUGO)
1521da177e4SLinus Torvalds attr |= ADFS_NDA_OWNER_WRITE;
1531da177e4SLinus Torvalds
15481916245SRussell King mode = ia_mode & asb->s_other_mask;
1551da177e4SLinus Torvalds mode &= ~asb->s_owner_mask;
1561da177e4SLinus Torvalds if (mode & S_IRUGO)
1571da177e4SLinus Torvalds attr |= ADFS_NDA_PUBLIC_READ;
1581da177e4SLinus Torvalds if (mode & S_IWUGO)
1591da177e4SLinus Torvalds attr |= ADFS_NDA_PUBLIC_WRITE;
1601da177e4SLinus Torvalds
1611da177e4SLinus Torvalds return attr;
1621da177e4SLinus Torvalds }
1631da177e4SLinus Torvalds
164eeeb9dd9SRussell King static const s64 nsec_unix_epoch_diff_risc_os_epoch = 2208988800000000000LL;
165eeeb9dd9SRussell King
1661da177e4SLinus Torvalds /*
1671da177e4SLinus Torvalds * Convert an ADFS time to Unix time. ADFS has a 40-bit centi-second time
1687a9730afSStuart Swales * referenced to 1 Jan 1900 (til 2248) so we need to discard 2208988800 seconds
1697a9730afSStuart Swales * of time to convert from RISC OS epoch to Unix epoch.
1701da177e4SLinus Torvalds */
1711da177e4SLinus Torvalds static void
adfs_adfs2unix_time(struct timespec64 * tv,struct inode * inode)172d9edcbc4SArnd Bergmann adfs_adfs2unix_time(struct timespec64 *tv, struct inode *inode)
1731da177e4SLinus Torvalds {
1741da177e4SLinus Torvalds unsigned int high, low;
1757a9730afSStuart Swales /* 01 Jan 1970 00:00:00 (Unix epoch) as nanoseconds since
1767a9730afSStuart Swales * 01 Jan 1900 00:00:00 (RISC OS epoch)
1777a9730afSStuart Swales */
1787a9730afSStuart Swales s64 nsec;
1791da177e4SLinus Torvalds
180b4ed8f75SRussell King if (!adfs_inode_is_stamped(inode))
1811da177e4SLinus Torvalds goto cur_time;
1821da177e4SLinus Torvalds
1837a9730afSStuart Swales high = ADFS_I(inode)->loadaddr & 0xFF; /* top 8 bits of timestamp */
1847a9730afSStuart Swales low = ADFS_I(inode)->execaddr; /* bottom 32 bits of timestamp */
1851da177e4SLinus Torvalds
1867a9730afSStuart Swales /* convert 40-bit centi-seconds to 32-bit seconds
1877a9730afSStuart Swales * going via nanoseconds to retain precision
1887a9730afSStuart Swales */
1897a9730afSStuart Swales nsec = (((s64) high << 32) | (s64) low) * 10000000; /* cs to ns */
1901da177e4SLinus Torvalds
1911da177e4SLinus Torvalds /* Files dated pre 01 Jan 1970 00:00:00. */
1927a9730afSStuart Swales if (nsec < nsec_unix_epoch_diff_risc_os_epoch)
1931da177e4SLinus Torvalds goto too_early;
1941da177e4SLinus Torvalds
1957a9730afSStuart Swales /* convert from RISC OS to Unix epoch */
1967a9730afSStuart Swales nsec -= nsec_unix_epoch_diff_risc_os_epoch;
1971da177e4SLinus Torvalds
198d9edcbc4SArnd Bergmann *tv = ns_to_timespec64(nsec);
1991da177e4SLinus Torvalds return;
2001da177e4SLinus Torvalds
2011da177e4SLinus Torvalds cur_time:
202d9edcbc4SArnd Bergmann *tv = current_time(inode);
2031da177e4SLinus Torvalds return;
2041da177e4SLinus Torvalds
2051da177e4SLinus Torvalds too_early:
2061da177e4SLinus Torvalds tv->tv_sec = tv->tv_nsec = 0;
2071da177e4SLinus Torvalds return;
2081da177e4SLinus Torvalds }
2091da177e4SLinus Torvalds
210eeeb9dd9SRussell King /* Convert an Unix time to ADFS time for an entry that is already stamped. */
adfs_unix2adfs_time(struct inode * inode,const struct timespec64 * ts)211eeeb9dd9SRussell King static void adfs_unix2adfs_time(struct inode *inode,
212eeeb9dd9SRussell King const struct timespec64 *ts)
2131da177e4SLinus Torvalds {
214eeeb9dd9SRussell King s64 cs, nsec = timespec64_to_ns(ts);
2151da177e4SLinus Torvalds
216eeeb9dd9SRussell King /* convert from Unix to RISC OS epoch */
217eeeb9dd9SRussell King nsec += nsec_unix_epoch_diff_risc_os_epoch;
2181da177e4SLinus Torvalds
219eeeb9dd9SRussell King /* convert from nanoseconds to centiseconds */
220eeeb9dd9SRussell King cs = div_s64(nsec, 10000000);
221eeeb9dd9SRussell King
222eeeb9dd9SRussell King cs = clamp_t(s64, cs, 0, 0xffffffffff);
223eeeb9dd9SRussell King
224eeeb9dd9SRussell King ADFS_I(inode)->loadaddr &= ~0xff;
225eeeb9dd9SRussell King ADFS_I(inode)->loadaddr |= (cs >> 32) & 0xff;
226eeeb9dd9SRussell King ADFS_I(inode)->execaddr = cs;
2271da177e4SLinus Torvalds }
2281da177e4SLinus Torvalds
2291da177e4SLinus Torvalds /*
2301da177e4SLinus Torvalds * Fill in the inode information from the object information.
2311da177e4SLinus Torvalds *
2321da177e4SLinus Torvalds * Note that this is an inode-less filesystem, so we can't use the inode
2331da177e4SLinus Torvalds * number to reference the metadata on the media. Instead, we use the
2341da177e4SLinus Torvalds * inode number to hold the object ID, which in turn will tell us where
2351da177e4SLinus Torvalds * the data is held. We also save the parent object ID, and with these
2361da177e4SLinus Torvalds * two, we can locate the metadata.
2371da177e4SLinus Torvalds *
2381da177e4SLinus Torvalds * This does mean that we rely on an objects parent remaining the same at
2391da177e4SLinus Torvalds * all times - we cannot cope with a cross-directory rename (yet).
2401da177e4SLinus Torvalds */
2411da177e4SLinus Torvalds struct inode *
adfs_iget(struct super_block * sb,struct object_info * obj)2421da177e4SLinus Torvalds adfs_iget(struct super_block *sb, struct object_info *obj)
2431da177e4SLinus Torvalds {
2441da177e4SLinus Torvalds struct inode *inode;
2451da177e4SLinus Torvalds
2461da177e4SLinus Torvalds inode = new_inode(sb);
2471da177e4SLinus Torvalds if (!inode)
2481da177e4SLinus Torvalds goto out;
2491da177e4SLinus Torvalds
2501da177e4SLinus Torvalds inode->i_uid = ADFS_SB(sb)->s_uid;
2511da177e4SLinus Torvalds inode->i_gid = ADFS_SB(sb)->s_gid;
2525ed70bb4SRussell King inode->i_ino = obj->indaddr;
2531da177e4SLinus Torvalds inode->i_size = obj->size;
254bfe86848SMiklos Szeredi set_nlink(inode, 2);
2551da177e4SLinus Torvalds inode->i_blocks = (inode->i_size + sb->s_blocksize - 1) >>
2561da177e4SLinus Torvalds sb->s_blocksize_bits;
2571da177e4SLinus Torvalds
2581da177e4SLinus Torvalds /*
2591da177e4SLinus Torvalds * we need to save the parent directory ID so that
2601da177e4SLinus Torvalds * write_inode can update the directory information
2611da177e4SLinus Torvalds * for this file. This will need special handling
2621da177e4SLinus Torvalds * for cross-directory renames.
2631da177e4SLinus Torvalds */
2641da177e4SLinus Torvalds ADFS_I(inode)->parent_id = obj->parent_id;
26525e5d4dfSRussell King ADFS_I(inode)->indaddr = obj->indaddr;
2661da177e4SLinus Torvalds ADFS_I(inode)->loadaddr = obj->loadaddr;
2671da177e4SLinus Torvalds ADFS_I(inode)->execaddr = obj->execaddr;
2681da177e4SLinus Torvalds ADFS_I(inode)->attr = obj->attr;
2691da177e4SLinus Torvalds
2701da177e4SLinus Torvalds inode->i_mode = adfs_atts2mode(sb, inode);
271d9edcbc4SArnd Bergmann adfs_adfs2unix_time(&inode->i_mtime, inode);
2721da177e4SLinus Torvalds inode->i_atime = inode->i_mtime;
273*96894147SJeff Layton inode_set_ctime_to_ts(inode, inode->i_mtime);
2741da177e4SLinus Torvalds
2751da177e4SLinus Torvalds if (S_ISDIR(inode->i_mode)) {
2761da177e4SLinus Torvalds inode->i_op = &adfs_dir_inode_operations;
2771da177e4SLinus Torvalds inode->i_fop = &adfs_dir_operations;
2781da177e4SLinus Torvalds } else if (S_ISREG(inode->i_mode)) {
2791da177e4SLinus Torvalds inode->i_op = &adfs_file_inode_operations;
2801da177e4SLinus Torvalds inode->i_fop = &adfs_file_operations;
2811da177e4SLinus Torvalds inode->i_mapping->a_ops = &adfs_aops;
2821da177e4SLinus Torvalds ADFS_I(inode)->mmu_private = inode->i_size;
2831da177e4SLinus Torvalds }
2841da177e4SLinus Torvalds
285d8e78da8SAl Viro inode_fake_hash(inode);
2861da177e4SLinus Torvalds
2871da177e4SLinus Torvalds out:
2881da177e4SLinus Torvalds return inode;
2891da177e4SLinus Torvalds }
2901da177e4SLinus Torvalds
2911da177e4SLinus Torvalds /*
2921da177e4SLinus Torvalds * Validate and convert a changed access mode/time to their ADFS equivalents.
2931da177e4SLinus Torvalds * adfs_write_inode will actually write the information back to the directory
2941da177e4SLinus Torvalds * later.
2951da177e4SLinus Torvalds */
2961da177e4SLinus Torvalds int
adfs_notify_change(struct mnt_idmap * idmap,struct dentry * dentry,struct iattr * attr)297c1632a0fSChristian Brauner adfs_notify_change(struct mnt_idmap *idmap, struct dentry *dentry,
298549c7297SChristian Brauner struct iattr *attr)
2991da177e4SLinus Torvalds {
3002b0143b5SDavid Howells struct inode *inode = d_inode(dentry);
3011da177e4SLinus Torvalds struct super_block *sb = inode->i_sb;
3021da177e4SLinus Torvalds unsigned int ia_valid = attr->ia_valid;
3031da177e4SLinus Torvalds int error;
3041da177e4SLinus Torvalds
305c1632a0fSChristian Brauner error = setattr_prepare(&nop_mnt_idmap, dentry, attr);
3061da177e4SLinus Torvalds
3071da177e4SLinus Torvalds /*
3081da177e4SLinus Torvalds * we can't change the UID or GID of any file -
3091da177e4SLinus Torvalds * we have a global UID/GID in the superblock
3101da177e4SLinus Torvalds */
311c010d1ffSEric W. Biederman if ((ia_valid & ATTR_UID && !uid_eq(attr->ia_uid, ADFS_SB(sb)->s_uid)) ||
312c010d1ffSEric W. Biederman (ia_valid & ATTR_GID && !gid_eq(attr->ia_gid, ADFS_SB(sb)->s_gid)))
3131da177e4SLinus Torvalds error = -EPERM;
3141da177e4SLinus Torvalds
3151da177e4SLinus Torvalds if (error)
3161da177e4SLinus Torvalds goto out;
3171da177e4SLinus Torvalds
31815c6fd97Snpiggin@suse.de /* XXX: this is missing some actual on-disk truncation.. */
3191da177e4SLinus Torvalds if (ia_valid & ATTR_SIZE)
3202c27c65eSChristoph Hellwig truncate_setsize(inode, attr->ia_size);
3211da177e4SLinus Torvalds
322eeeb9dd9SRussell King if (ia_valid & ATTR_MTIME && adfs_inode_is_stamped(inode)) {
323eeeb9dd9SRussell King adfs_unix2adfs_time(inode, &attr->ia_mtime);
324eeeb9dd9SRussell King adfs_adfs2unix_time(&inode->i_mtime, inode);
3251da177e4SLinus Torvalds }
326eeeb9dd9SRussell King
3271da177e4SLinus Torvalds /*
3281da177e4SLinus Torvalds * FIXME: should we make these == to i_mtime since we don't
3291da177e4SLinus Torvalds * have the ability to represent them in our filesystem?
3301da177e4SLinus Torvalds */
3311da177e4SLinus Torvalds if (ia_valid & ATTR_ATIME)
3321da177e4SLinus Torvalds inode->i_atime = attr->ia_atime;
3331da177e4SLinus Torvalds if (ia_valid & ATTR_CTIME)
334*96894147SJeff Layton inode_set_ctime_to_ts(inode, attr->ia_ctime);
3351da177e4SLinus Torvalds if (ia_valid & ATTR_MODE) {
33681916245SRussell King ADFS_I(inode)->attr = adfs_mode2atts(sb, inode, attr->ia_mode);
3371da177e4SLinus Torvalds inode->i_mode = adfs_atts2mode(sb, inode);
3381da177e4SLinus Torvalds }
3391da177e4SLinus Torvalds
3401da177e4SLinus Torvalds /*
3411da177e4SLinus Torvalds * FIXME: should we be marking this inode dirty even if
3421da177e4SLinus Torvalds * we don't have any metadata to write back?
3431da177e4SLinus Torvalds */
3441da177e4SLinus Torvalds if (ia_valid & (ATTR_SIZE | ATTR_MTIME | ATTR_MODE))
3451da177e4SLinus Torvalds mark_inode_dirty(inode);
3461da177e4SLinus Torvalds out:
3471da177e4SLinus Torvalds return error;
3481da177e4SLinus Torvalds }
3491da177e4SLinus Torvalds
3501da177e4SLinus Torvalds /*
3511da177e4SLinus Torvalds * write an existing inode back to the directory, and therefore the disk.
3521da177e4SLinus Torvalds * The adfs-specific inode data has already been updated by
3531da177e4SLinus Torvalds * adfs_notify_change()
3541da177e4SLinus Torvalds */
adfs_write_inode(struct inode * inode,struct writeback_control * wbc)355a9185b41SChristoph Hellwig int adfs_write_inode(struct inode *inode, struct writeback_control *wbc)
3561da177e4SLinus Torvalds {
3571da177e4SLinus Torvalds struct super_block *sb = inode->i_sb;
3581da177e4SLinus Torvalds struct object_info obj;
3591da177e4SLinus Torvalds
36025e5d4dfSRussell King obj.indaddr = ADFS_I(inode)->indaddr;
3611da177e4SLinus Torvalds obj.name_len = 0;
3621da177e4SLinus Torvalds obj.parent_id = ADFS_I(inode)->parent_id;
3631da177e4SLinus Torvalds obj.loadaddr = ADFS_I(inode)->loadaddr;
3641da177e4SLinus Torvalds obj.execaddr = ADFS_I(inode)->execaddr;
3651da177e4SLinus Torvalds obj.attr = ADFS_I(inode)->attr;
3661da177e4SLinus Torvalds obj.size = inode->i_size;
3671da177e4SLinus Torvalds
36825d2e886SMinghao Chi return adfs_dir_update(sb, &obj, wbc->sync_mode == WB_SYNC_ALL);
3691da177e4SLinus Torvalds }
370