/* * Search attribute specifed in ntnode (load ntnode if nessecary). * If not found but ATTR_A_ATTRLIST present, read it in and search throught. * VOP_VGET node needed, and lookup througth it's ntnode (load if nessesary). * * ntnode should be locked */ int ntfs_ntvattrget(struct ntfsmount *ntmp, struct ntnode *ip, u_int32_t type, const char *name, cn_t vcn, struct ntvattr **vapp) { struct ntvattr *lvap = NULL; struct attr_attrlist *aalp; struct attr_attrlist *nextaalp; struct vnode *newvp; struct ntnode *newip; caddr_t alpool; size_t namelen, len; int error; *vapp = NULL; if (name) { dprintf(("ntfs_ntvattrget: " \ "ino: %"PRId64", type: 0x%x, name: %s, vcn: %d\n", \ ip->i_number, type, name, (u_int32_t) vcn)); namelen = strlen(name); } else { dprintf(("ntfs_ntvattrget: " \ "ino: %"PRId64", type: 0x%x, vcn: %d\n", \ ip->i_number, type, (u_int32_t) vcn)); name = ""; namelen = 0; } error = ntfs_findvattr(ntmp, ip, &lvap, vapp, type, name, namelen, vcn); if (error >= 0) return (error); if (!lvap) { dprintf(("ntfs_ntvattrget: UNEXISTED ATTRIBUTE: " \ "ino: %"PRId64", type: 0x%x, name: %s, vcn: %d\n", \ ip->i_number, type, name, (u_int32_t) vcn)); return (ENOENT); } /* Scan $ATTRIBUTE_LIST for requested attribute */ len = lvap->va_datalen; alpool = kmalloc(len, M_TEMP, M_WAITOK); error = ntfs_readntvattr_plain(ntmp, ip, lvap, 0, len, alpool, &len, NULL); if (error) goto out; aalp = (struct attr_attrlist *) alpool; nextaalp = NULL; for(; len > 0; aalp = nextaalp) { dprintf(("ntfs_ntvattrget: " \ "attrlist: ino: %d, attr: 0x%x, vcn: %d\n", \ aalp->al_inumber, aalp->al_type, \ (u_int32_t) aalp->al_vcnstart)); if (len > aalp->reclen) { nextaalp = NTFS_NEXTREC(aalp, struct attr_attrlist *); } else {
/* * Search attribute specified in ntnode (load ntnode if necessary). * If not found but ATTR_A_ATTRLIST present, read it in and search through. * * ntnode should be locked */ int ntfs_ntvattrget(struct ntfsmount *ntmp, struct ntnode *ip, u_int32_t type, const char *name, cn_t vcn, struct ntvattr **vapp) { struct ntvattr *lvap = NULL; struct attr_attrlist *aalp; struct attr_attrlist *nextaalp; struct ntnode *newip; void *alpool; size_t namelen, len; int error; *vapp = NULL; if (name) { dprintf(("%s: ino: %llu, type: 0x%x, name: %s, vcn: %qu\n", __func__, (unsigned long long)ip->i_number, type, name, (long long)vcn)); namelen = strlen(name); } else { dprintf(("%s: ino: %llu, type: 0x%x, vcn: %qu\n", __func__, (unsigned long long)ip->i_number, type, (long long)vcn)); name = ""; namelen = 0; } error = ntfs_findvattr(ntmp, ip, &lvap, vapp, type, name, namelen, vcn); if (error >= 0) return (error); if (!lvap) { dprintf(("%s: NON-EXISTENT ATTRIBUTE: " "ino: %llu, type: 0x%x, name: %s, vcn: %qu\n", __func__, (unsigned long long)ip->i_number, type, name, (long long)vcn)); return (ENOENT); } /* Scan $ATTRIBUTE_LIST for requested attribute */ len = lvap->va_datalen; alpool = malloc(len, M_TEMP, M_WAITOK); error = ntfs_readntvattr_plain(ntmp, ip, lvap, 0, len, alpool, &len, NULL); if (error) goto out; aalp = (struct attr_attrlist *) alpool; nextaalp = NULL; for (; len > 0; aalp = nextaalp) { KASSERT(aalp != NULL); dprintf(("%s: attrlist: ino: %d, attr: 0x%x, vcn: %qu\n", __func__, aalp->al_inumber, aalp->al_type, (long long) aalp->al_vcnstart)); if (len > aalp->reclen) { nextaalp = NTFS_NEXTREC(aalp, struct attr_attrlist *); } else {