Changeset 54caa41b in mainline


Ignore:
Timestamp:
2011-03-24T21:30:52Z (13 years ago)
Author:
Maurizio Lombardi <m.lombardi85@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
41202a9
Parents:
cfbcd86
Message:

Link mfs_has_children() function to the libfs_ops structure

Location:
uspace/srv/fs/minixfs
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • uspace/srv/fs/minixfs/Makefile

    rcfbcd86 r54caa41b  
    3838        mfs_inode.c \
    3939        mfs_read.c \
     40        mfs_dentry.c \
    4041        mfs_utils.c
    4142
  • uspace/srv/fs/minixfs/mfs.c

    rcfbcd86 r54caa41b  
    107107                        mfs_stat(callid, &call);
    108108                        break;
     109                case VFS_OUT_LOOKUP:
     110                        mfs_lookup(callid, &call);
     111                        break;
    109112                default:
    110113                        async_answer_0(callid, ENOTSUP);
  • uspace/srv/fs/minixfs/mfs.h

    rcfbcd86 r54caa41b  
    9696        /*Block numbers for indirect zones*/
    9797        uint32_t        i_izone[V2_NR_INDIRECT_ZONES];
     98
     99        bool dirty;
     100};
     101
     102/*Generic MFS directory entry*/
     103struct mfs_dentry_info {
     104        uint32_t d_inum;
     105        char d_name[MFS3_MAX_NAME_LEN];
     106
     107        bool dirty;
    98108};
    99109
     
    113123extern void mfs_mounted(ipc_callid_t rid, ipc_call_t *request);
    114124extern void mfs_mount(ipc_callid_t rid, ipc_call_t *request);
     125extern void mfs_lookup(ipc_callid_t rid, ipc_call_t *request);
    115126extern aoff64_t mfs_size_get(fs_node_t *node);
    116127extern bool mfs_is_directory(fs_node_t *fsnode);
    117128extern bool mfs_is_file(fs_node_t *fsnode);
    118129extern char mfs_plb_get_char(unsigned pos);
     130extern int mfs_has_children(bool *has_children, fs_node_t *fsnode);
    119131extern int mfs_root_get(fs_node_t **rfn, devmap_handle_t handle);
    120132extern devmap_handle_t mfs_device_get(fs_node_t *fsnode);
     
    138150int read_map(uint32_t *b, const struct mfs_node *mnode, const uint32_t pos);
    139151
     152/*mfs_dentry.c*/
     153extern struct mfs_dentry_info *
     154read_directory_entry(struct mfs_node *mnode, unsigned index);
     155
    140156#endif
    141157
  • uspace/srv/fs/minixfs/mfs_inode.c

    rcfbcd86 r54caa41b  
    7979
    8080        block_put(b);
     81        free(ino);
     82        ino_i->dirty = false;
    8183
    82         free(ino);
    8384        return ino_i;
    8485
     
    137138
    138139        block_put(b);
     140        free(ino);
     141        ino_i->dirty = false;
    139142
    140         free(ino);
    141143        return ino_i;
    142144
  • uspace/srv/fs/minixfs/mfs_ops.c

    rcfbcd86 r54caa41b  
    5454        .is_file = mfs_is_file,
    5555        .node_get = mfs_node_get,
    56         .plb_get_char = mfs_plb_get_char
     56        .plb_get_char = mfs_plb_get_char,
     57        .has_children = mfs_has_children
    5758};
    5859
     
    312313}
    313314
     315void mfs_lookup(ipc_callid_t rid, ipc_call_t *request)
     316{
     317        libfs_lookup(&mfs_libfs_ops, mfs_reg.fs_handle, rid, request);
     318}
     319
    314320char mfs_plb_get_char(unsigned pos)
    315321{
    316322        return mfs_reg.plb_ro[pos % PLB_SIZE];
     323}
     324
     325int mfs_has_children(bool *has_children, fs_node_t *fsnode)
     326{
     327        struct mfs_node *mnode = fsnode->data;
     328        const struct mfs_ino_info *ino_i = mnode->ino_i;
     329        const struct mfs_instance *inst = mnode->instance;
     330        const struct mfs_sb_info *sbi = inst->sbi;
     331        int i;
     332
     333        *has_children = false;
     334
     335        if (!S_ISDIR(mnode->ino_i->i_mode))
     336                goto out;
     337
     338        struct mfs_dentry_info *d_info;
     339
     340        for (i = 2; i < ino_i->i_size / sbi->dirsize; ++i) {
     341                d_info = read_directory_entry(mnode, i);
     342
     343                if (!d_info)
     344                        goto out;
     345
     346                if (d_info->d_inum) {
     347                        *has_children = true;
     348                        free(d_info);
     349                        break;
     350                }
     351
     352                free(d_info);
     353        }
     354
     355        if (*has_children)
     356                mfsdebug("Has children\n");
     357        else
     358                mfsdebug("Has not children\n");
     359
     360out:
     361        return EOK;
    317362}
    318363
Note: See TracChangeset for help on using the changeset viewer.