-
- dip->i_di.di_mtime = dip->i_di.di_ctime = get_seconds();
-
- gfs2_dinode_out(&dip->i_di, dibh->b_data);
-
- out:
- brelse(dibh);
-
- return error;
-}
-
-static int dir_l_read(struct gfs2_inode *dip, uint64_t *offset, void *opaque,
- gfs2_filldir_t filldir)
-{
- struct buffer_head *dibh;
- int copied = 0;
- int error;
-
- if (!gfs2_is_stuffed(dip)) {
- gfs2_consist_inode(dip);
- return -EIO;
- }
-
- if (!dip->i_di.di_entries)
- return 0;
-
- error = gfs2_meta_inode_buffer(dip, &dibh);
- if (error)
- return error;
-
- error = do_filldir_single(dip, offset,
- opaque, filldir,
- dibh, dip->i_di.di_entries,
- &copied);
- if (error > 0)
- error = 0;
-
- brelse(dibh);
-
- return error;
-}
-
-static int dir_l_mvino(struct gfs2_inode *dip, struct qstr *filename,
- struct gfs2_inum *inum, unsigned int new_type)
-{
- struct buffer_head *dibh;
- struct gfs2_dirent *dent;
- int error;
-
- if (!gfs2_is_stuffed(dip)) {
- gfs2_consist_inode(dip);
- return -EIO;
- }
-
- error = gfs2_meta_inode_buffer(dip, &dibh);
- if (error)
- return error;
-
- error = leaf_search(dip, dibh, filename, &dent, NULL);
- if (error == -ENOENT) {
- gfs2_consist_inode(dip);
- error = -EIO;
- goto out;
- }
- if (error)
- goto out;
-
- gfs2_trans_add_bh(dip->i_gl, dibh, 1);
-
- gfs2_inum_out(inum, (char *)&dent->de_inum);
- dent->de_type = new_type;
-
- dip->i_di.di_mtime = dip->i_di.di_ctime = get_seconds();
-
- gfs2_dinode_out(&dip->i_di, dibh->b_data);
-
- out:
- brelse(dibh);
-
- return error;
-}
-
-/**
- * gfs2_dir_search - Search a directory
- * @dip: The GFS2 inode
- * @filename:
- * @inode:
- *
- * This routine searches a directory for a file or another directory.
- * Assumes a glock is held on dip.
- *
- * Returns: errno
- */
-
-int gfs2_dir_search(struct gfs2_inode *dip, struct qstr *filename,
- struct gfs2_inum *inum, unsigned int *type)
-{
- int error;
-
- if (dip->i_di.di_flags & GFS2_DIF_EXHASH)
- error = dir_e_search(dip, filename, inum, type);
- else
- error = dir_l_search(dip, filename, inum, type);
-
- return error;
-}
-
-/**
- * gfs2_dir_add - Add new filename into directory
- * @dip: The GFS2 inode
- * @filename: The new name
- * @inode: The inode number of the entry
- * @type: The type of the entry
- *
- * Returns: 0 on success, error code on failure
- */
-
-int gfs2_dir_add(struct gfs2_inode *dip, struct qstr *filename,
- struct gfs2_inum *inum, unsigned int type)
-{
- int error;
-
- if (dip->i_di.di_flags & GFS2_DIF_EXHASH)
- error = dir_e_add(dip, filename, inum, type);
- else
- error = dir_l_add(dip, filename, inum, type);
-
- return error;
-}
-
-/**
- * gfs2_dir_del - Delete a directory entry
- * @dip: The GFS2 inode
- * @filename: The filename
- *
- * Returns: 0 on success, error code on failure
- */
-
-int gfs2_dir_del(struct gfs2_inode *dip, struct qstr *filename)
-{
- int error;
-
- if (dip->i_di.di_flags & GFS2_DIF_EXHASH)
- error = dir_e_del(dip, filename);
- else
- error = dir_l_del(dip, filename);
-
- return error;
-}
-
-int gfs2_dir_read(struct gfs2_inode *dip, uint64_t *offset, void *opaque,
- gfs2_filldir_t filldir)
-{
- int error;
-
- if (dip->i_di.di_flags & GFS2_DIF_EXHASH)
- error = dir_e_read(dip, offset, opaque, filldir);
- else
- error = dir_l_read(dip, offset, opaque, filldir);