source: trunk/target/linux/generic/patches-3.12/503-yaffs-3.12-convert-readdir-to-iterate.patch @ 39084

Last change on this file since 39084 was 39084, checked in by juhosg, 3 years ago

kernel: update yaffs code

Use the latest version of the yaffs code. Fetched from the
yaffs2 git tree and it is based on the following commit:

commit bc76682d93955cfb33051beb503ad9f8a5450578
Merge: 3a8580e ffa781d
Author: Charles Manning <cdhmanning@…>
Date: Thu Jul 11 17:46:25 2013 +1200

Merge branch 'master' of ssh://www.aleph1.co.uk/home/aleph1/git/yaffs2

Signed-off-by: Gabor Juhos <juhosg@…>

File size: 2.9 KB
  • fs/yaffs2/yaffs_vfs.c

    a b static void yaffs_remove_obj_callback(st 
    17011701 
    17021702/*-----------------------------------------------------------------*/ 
    17031703 
     1704#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 12, 0)) 
     1705static int yaffs_readdir(struct file *file, struct dir_context *ctx) 
     1706{ 
     1707        struct yaffs_obj *obj; 
     1708        struct yaffs_dev *dev; 
     1709        struct yaffs_search_context *sc; 
     1710        struct inode *inode = file->f_dentry->d_inode; 
     1711        unsigned long offset, curoffs; 
     1712        struct yaffs_obj *l; 
     1713        int ret_val = 0; 
     1714 
     1715        char name[YAFFS_MAX_NAME_LENGTH + 1]; 
     1716 
     1717        obj = yaffs_dentry_to_obj(file->f_dentry); 
     1718        dev = obj->my_dev; 
     1719 
     1720        yaffs_gross_lock(dev); 
     1721 
     1722        yaffs_dev_to_lc(dev)->readdir_process = current; 
     1723 
     1724        offset = ctx->pos; 
     1725 
     1726        sc = yaffs_new_search(obj); 
     1727        if (!sc) { 
     1728                ret_val = -ENOMEM; 
     1729                goto out; 
     1730        } 
     1731 
     1732        yaffs_trace(YAFFS_TRACE_OS, 
     1733                "yaffs_readdir: starting at %d", (int)offset); 
     1734 
     1735        if (offset == 0) { 
     1736                yaffs_trace(YAFFS_TRACE_OS, 
     1737                        "yaffs_readdir: entry . ino %d", 
     1738                        (int)inode->i_ino); 
     1739                yaffs_gross_unlock(dev); 
     1740                if (!dir_emit_dot(file, ctx)) { 
     1741                        yaffs_gross_lock(dev); 
     1742                        goto out; 
     1743                } 
     1744                yaffs_gross_lock(dev); 
     1745                offset++; 
     1746                ctx->pos++; 
     1747        } 
     1748        if (offset == 1) { 
     1749                yaffs_trace(YAFFS_TRACE_OS, 
     1750                        "yaffs_readdir: entry .. ino %d", 
     1751                        (int)file->f_dentry->d_parent->d_inode->i_ino); 
     1752                yaffs_gross_unlock(dev); 
     1753                if (!dir_emit_dotdot(file, ctx)) { 
     1754                        yaffs_gross_lock(dev); 
     1755                        goto out; 
     1756                } 
     1757                yaffs_gross_lock(dev); 
     1758                offset++; 
     1759                ctx->pos++; 
     1760        } 
     1761 
     1762        curoffs = 1; 
     1763 
     1764        /* If the directory has changed since the open or last call to 
     1765           readdir, rewind to after the 2 canned entries. */ 
     1766        if (file->f_version != inode->i_version) { 
     1767                offset = 2; 
     1768                ctx->pos = offset; 
     1769                file->f_version = inode->i_version; 
     1770        } 
     1771 
     1772        while (sc->next_return) { 
     1773                curoffs++; 
     1774                l = sc->next_return; 
     1775                if (curoffs >= offset) { 
     1776                        int this_inode = yaffs_get_obj_inode(l); 
     1777                        int this_type = yaffs_get_obj_type(l); 
     1778 
     1779                        yaffs_get_obj_name(l, name, YAFFS_MAX_NAME_LENGTH + 1); 
     1780                        yaffs_trace(YAFFS_TRACE_OS, 
     1781                                "yaffs_readdir: %s inode %d", 
     1782                                name, yaffs_get_obj_inode(l)); 
     1783 
     1784                        yaffs_gross_unlock(dev); 
     1785 
     1786                        if (!dir_emit(ctx, name, strlen(name), 
     1787                                      this_inode, this_type) < 0) { 
     1788                                yaffs_gross_lock(dev); 
     1789                                goto out; 
     1790                        } 
     1791 
     1792                        yaffs_gross_lock(dev); 
     1793 
     1794                        offset++; 
     1795                        ctx->pos++; 
     1796                } 
     1797                yaffs_search_advance(sc); 
     1798        } 
     1799 
     1800out: 
     1801        yaffs_search_end(sc); 
     1802        yaffs_dev_to_lc(dev)->readdir_process = NULL; 
     1803        yaffs_gross_unlock(dev); 
     1804 
     1805        return ret_val; 
     1806} 
     1807#else 
    17041808static int yaffs_readdir(struct file *f, void *dirent, filldir_t filldir) 
    17051809{ 
    17061810        struct yaffs_obj *obj; 
    out: 
    18071911 
    18081912        return ret_val; 
    18091913} 
     1914#endif 
    18101915 
    18111916static const struct file_operations yaffs_dir_operations = { 
    18121917        .read = generic_read_dir, 
     1918#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 12, 0)) 
     1919        .iterate = yaffs_readdir, 
     1920#else 
    18131921        .readdir = yaffs_readdir, 
     1922#endif 
    18141923        .fsync = yaffs_sync_object, 
    18151924        .llseek = generic_file_llseek, 
    18161925}; 
Note: See TracBrowser for help on using the repository browser.