asmlinkage long sys_newlstat(char * filename, struct stat * statbuf) { struct nameidata nd; int error; error = user_path_walk_link(filename, &nd); if (!error) { error = do_revalidate(nd.dentry); if (!error) error = cp_new_stat(nd.dentry->d_inode, statbuf); path_release(&nd); } return error; }
asmlinkage long sys_newfstat(unsigned int fd, struct stat * statbuf) { struct file * f; int err = -EBADF; f = fget(fd); if (f) { struct dentry * dentry = f->f_dentry; err = do_revalidate(dentry); if (!err) err = cp_new_stat(dentry->d_inode, statbuf); fput(f); } return err; }
/* * For backward compatibility? Maybe this should be moved * into arch/i386 instead? */ asmlinkage long sys_stat(char * filename, struct __old_kernel_stat * statbuf) { struct nameidata nd; int error, errcnt = 0; again: error = user_path_walk(filename, &nd); if (!error) { error = do_revalidate(nd.dentry); if (!error) error = cp_old_stat(nd.dentry->d_inode, statbuf); path_release(&nd); } if (error == -ESTALE && !errcnt) { errcnt++; goto again; } return error; }
asmlinkage long sys_readlink(const char * path, char * buf, int bufsiz) { struct nameidata nd; int error; if (bufsiz <= 0) return -EINVAL; error = user_path_walk_link(path, &nd); if (!error) { struct inode * inode = nd.dentry->d_inode; error = -EINVAL; if (inode->i_op && inode->i_op->readlink && !(error = do_revalidate(nd.dentry))) { UPDATE_ATIME(inode); error = inode->i_op->readlink(nd.dentry, buf, bufsiz); } path_release(&nd); } return error; }
/* XXX check this out */ struct presto_file_set *presto_path2fileset(const char *name) { struct nameidata nd; struct presto_file_set *fileset; int error; ENTRY; error = presto_walk(name, &nd); if (!error) { #if 0 error = do_revalidate(nd.dentry); #endif if (!error) fileset = presto_fset(nd.dentry); path_release(&nd); EXIT; } else fileset = ERR_PTR(error); EXIT; return fileset; }