/* * Create the EMD file for a directory if it doesn't * already exist. Returns 0 or an error code. * * Note: the caller must hold a lock on the parent directory. */ int umsdos_make_emd(struct dentry *parent) { struct dentry *demd = umsdos_get_emd_dentry(parent); int err = PTR_ERR(demd); if (IS_ERR(demd)) { printk("umsdos_make_emd: can't get dentry in %s, err=%d\n", parent->d_name.name, err); goto out; } /* already created? */ err = 0; if (demd->d_inode) goto out_set; Printk(("umsdos_make_emd: creating EMD %s/%s\n", parent->d_name.name, demd->d_name.name)); err = msdos_create(parent->d_inode, demd, S_IFREG | 0777); if (err) { printk (KERN_WARNING "umsdos_make_emd: create %s/%s failed, err=%d\n", parent->d_name.name, demd->d_name.name, err); goto out_dput; } out_set: parent->d_inode->u.umsdos_i.i_emd_dir = demd->d_inode->i_ino; out_dput: dput(demd); out: return err; }
/* Locate the EMD file in a directory and optionally, creates it. Return NULL if error. If ok, dir->u.umsdos_i.emd_inode */ struct inode *umsdos_emd_dir_lookup(struct inode *dir, int creat) { struct inode *ret = NULL; if (dir->u.umsdos_i.i_emd_dir != 0){ ret = iget (dir->i_sb,dir->u.umsdos_i.i_emd_dir); PRINTK (("deja trouve %d %x [%d] " ,dir->u.umsdos_i.i_emd_dir,ret,ret->i_count)); }else{ umsdos_real_lookup (dir,UMSDOS_EMD_FILE,UMSDOS_EMD_NAMELEN,&ret); PRINTK (("emd_dir_lookup ")); if (ret != NULL){ PRINTK (("Find --linux ")); dir->u.umsdos_i.i_emd_dir = ret->i_ino; }else if (creat){ int code; PRINTK (("avant create ")); dir->i_count++; code = msdos_create (dir,UMSDOS_EMD_FILE,UMSDOS_EMD_NAMELEN ,S_IFREG|0777,&ret); PRINTK (("Creat EMD code %d ret %x ",code,ret)); if (ret != NULL){ dir->u.umsdos_i.i_emd_dir = ret->i_ino; }else{ printk ("UMSDOS: Can't create EMD file\n"); } } } if (ret != NULL){ /* Disable UMSDOS_notify_change() for EMD file */ ret->u.umsdos_i.i_emd_owner = 0xffffffff; } return ret; }