Extended Attributes [take 2]
Oops I included ufs/ufs_extattr.c (the FFSv1 ones) not ffs/ffs_extattr.c which is the new file, so let's try again: ? o ? ffs/ffs_inode.c.debug Index: files.ufs === RCS file: /cvsroot/src/sys/ufs/files.ufs,v retrieving revision 1.45 diff -u -u -r1.45 files.ufs --- files.ufs 17 Jun 2019 03:32:58 - 1.45 +++ files.ufs 11 Apr 2020 00:13:05 - @@ -52,6 +52,7 @@ file ufs/ffs/ffs_alloc.c ffs file ufs/ffs/ffs_balloc.cffs file ufs/ffs/ffs_bswap.c (ffs | mfs) & ffs_ei +file ufs/ffs/ffs_extattr.c ffs & ufs_extattr file ufs/ffs/ffs_inode.c ffs file ufs/ffs/ffs_snapshot.c ffs file ufs/ffs/ffs_subr.c ffs Index: ffs/ffs_alloc.c === RCS file: /cvsroot/src/sys/ufs/ffs/ffs_alloc.c,v retrieving revision 1.166 diff -u -u -r1.166 ffs_alloc.c --- ffs/ffs_alloc.c 23 Feb 2020 15:46:42 - 1.166 +++ ffs/ffs_alloc.c 11 Apr 2020 00:13:05 - @@ -257,7 +257,10 @@ bno = ffs_hashalloc(ip, cg, bpref, size, 0, flags, ffs_alloccg); if (bno > 0) { DIP_ADD(ip, blocks, btodb(size)); - ip->i_flag |= IN_CHANGE | IN_UPDATE; + if (flags & IO_EXT) + ip->i_flag |= IN_CHANGE; + else + ip->i_flag |= IN_CHANGE | IN_UPDATE; *bnp = bno; return (0); } @@ -300,14 +303,15 @@ * => return with um_lock released */ int -ffs_realloccg(struct inode *ip, daddr_t lbprev, daddr_t bpref, int osize, -int nsize, kauth_cred_t cred, struct buf **bpp, daddr_t *blknop) +ffs_realloccg(struct inode *ip, daddr_t lbprev, daddr_t bprev, daddr_t bpref, +int osize, int nsize, int flags, kauth_cred_t cred, struct buf **bpp, +daddr_t *blknop) { struct ufsmount *ump; struct fs *fs; struct buf *bp; int cg, request, error; - daddr_t bprev, bno; + daddr_t bno; fs = ip->i_fs; ump = ip->i_ump; @@ -368,10 +372,6 @@ mutex_exit(>um_lock); goto nospace; } - if (fs->fs_magic == FS_UFS2_MAGIC) - bprev = ufs_rw64(ip->i_ffs2_db[lbprev], UFS_FSNEEDSWAP(fs)); - else - bprev = ufs_rw32(ip->i_ffs1_db[lbprev], UFS_FSNEEDSWAP(fs)); if (bprev == 0) { panic("%s: bad bprev: dev = 0x%llx, bsize = %d, bprev = %" @@ -403,7 +403,10 @@ mutex_enter(>um_lock); if ((bno = ffs_fragextend(ip, cg, bprev, osize, nsize)) != 0) { DIP_ADD(ip, blocks, btodb(nsize - osize)); - ip->i_flag |= IN_CHANGE | IN_UPDATE; + if (flags & IO_EXT) + ip->i_flag |= IN_CHANGE; + else + ip->i_flag |= IN_CHANGE | IN_UPDATE; if (bpp != NULL) { if (bp->b_blkno != FFS_FSBTODB(fs, bno)) { @@ -503,7 +506,10 @@ ip->i_number); } DIP_ADD(ip, blocks, btodb(nsize - osize)); - ip->i_flag |= IN_CHANGE | IN_UPDATE; + if (flags & IO_EXT) + ip->i_flag |= IN_CHANGE; + else + ip->i_flag |= IN_CHANGE | IN_UPDATE; if (bpp != NULL) { bp->b_blkno = FFS_FSBTODB(fs, bno); allocbuf(bp, nsize, 1); Index: ffs/ffs_balloc.c === RCS file: /cvsroot/src/sys/ufs/ffs/ffs_balloc.c,v retrieving revision 1.63 diff -u -u -r1.63 ffs_balloc.c --- ffs/ffs_balloc.c28 Oct 2017 00:37:13 - 1.63 +++ ffs/ffs_balloc.c11 Apr 2020 00:13:05 - @@ -72,6 +72,12 @@ static int ffs_balloc_ufs2(struct vnode *, off_t, int, kauth_cred_t, int, struct buf **); +static daddr_t +ffs_extb(struct fs *fs, struct ufs2_dinode *dp, daddr_t nb) +{ + return ufs_rw64(dp->di_extb[nb], UFS_FSNEEDSWAP(fs)); +} + /* * Balloc defines the structure of file system storage * by allocating the physical blocks on a device given @@ -139,10 +145,11 @@ osize = ffs_blksize(fs, ip, nb); if (osize < fs->fs_bsize && osize > 0) { mutex_enter(>um_lock); - error = ffs_realloccg(ip, nb, + error = ffs_realloccg(ip, nb, ffs_getdb(fs, ip, nb), ffs_blkpref_ufs1(ip, lastlbn, nb, flags, >i_ffs1_db[0]), - osize, (int)fs->fs_bsize, cred, bpp, ); + osize, (int)fs->fs_bsize, flags, cred, bpp, + ); if (error) return (error);
Extended Attribute support for FFSv2
Hi, I am planning to add ACL support to FFS. As I was porting the FreeBSD ACL code, I noticed that we currently lack extended attribute support for FFSv2, so I took a detour and added that support by copying the FreeBSD code (which you can compare against; I've left it mostly intact by adding compatibility defines). I am not sure if I got it all right, but I've written a simple unit-test and it passes and does not corrupt the filesystem. Here are my changes for review. If you think they are ok, I will commit them in a day or so. Thanks, christos Index: files.ufs === RCS file: /cvsroot/src/sys/ufs/files.ufs,v retrieving revision 1.45 diff -u -u -r1.45 files.ufs --- files.ufs 17 Jun 2019 03:32:58 - 1.45 +++ files.ufs 10 Apr 2020 22:15:21 - @@ -52,6 +52,7 @@ file ufs/ffs/ffs_alloc.c ffs file ufs/ffs/ffs_balloc.cffs file ufs/ffs/ffs_bswap.c (ffs | mfs) & ffs_ei +file ufs/ffs/ffs_extattr.c ffs & ufs_extattr file ufs/ffs/ffs_inode.c ffs file ufs/ffs/ffs_snapshot.c ffs file ufs/ffs/ffs_subr.c ffs Index: ffs/ffs_alloc.c === RCS file: /cvsroot/src/sys/ufs/ffs/ffs_alloc.c,v retrieving revision 1.166 diff -u -u -r1.166 ffs_alloc.c --- ffs/ffs_alloc.c 23 Feb 2020 15:46:42 - 1.166 +++ ffs/ffs_alloc.c 10 Apr 2020 22:15:22 - @@ -257,7 +257,10 @@ bno = ffs_hashalloc(ip, cg, bpref, size, 0, flags, ffs_alloccg); if (bno > 0) { DIP_ADD(ip, blocks, btodb(size)); - ip->i_flag |= IN_CHANGE | IN_UPDATE; + if (flags & IO_EXT) + ip->i_flag |= IN_CHANGE; + else + ip->i_flag |= IN_CHANGE | IN_UPDATE; *bnp = bno; return (0); } @@ -300,14 +303,15 @@ * => return with um_lock released */ int -ffs_realloccg(struct inode *ip, daddr_t lbprev, daddr_t bpref, int osize, -int nsize, kauth_cred_t cred, struct buf **bpp, daddr_t *blknop) +ffs_realloccg(struct inode *ip, daddr_t lbprev, daddr_t bprev, daddr_t bpref, +int osize, int nsize, int flags, kauth_cred_t cred, struct buf **bpp, +daddr_t *blknop) { struct ufsmount *ump; struct fs *fs; struct buf *bp; int cg, request, error; - daddr_t bprev, bno; + daddr_t bno; fs = ip->i_fs; ump = ip->i_ump; @@ -368,10 +372,6 @@ mutex_exit(>um_lock); goto nospace; } - if (fs->fs_magic == FS_UFS2_MAGIC) - bprev = ufs_rw64(ip->i_ffs2_db[lbprev], UFS_FSNEEDSWAP(fs)); - else - bprev = ufs_rw32(ip->i_ffs1_db[lbprev], UFS_FSNEEDSWAP(fs)); if (bprev == 0) { panic("%s: bad bprev: dev = 0x%llx, bsize = %d, bprev = %" @@ -403,7 +403,10 @@ mutex_enter(>um_lock); if ((bno = ffs_fragextend(ip, cg, bprev, osize, nsize)) != 0) { DIP_ADD(ip, blocks, btodb(nsize - osize)); - ip->i_flag |= IN_CHANGE | IN_UPDATE; + if (flags & IO_EXT) + ip->i_flag |= IN_CHANGE; + else + ip->i_flag |= IN_CHANGE | IN_UPDATE; if (bpp != NULL) { if (bp->b_blkno != FFS_FSBTODB(fs, bno)) { @@ -503,7 +506,10 @@ ip->i_number); } DIP_ADD(ip, blocks, btodb(nsize - osize)); - ip->i_flag |= IN_CHANGE | IN_UPDATE; + if (flags & IO_EXT) + ip->i_flag |= IN_CHANGE; + else + ip->i_flag |= IN_CHANGE | IN_UPDATE; if (bpp != NULL) { bp->b_blkno = FFS_FSBTODB(fs, bno); allocbuf(bp, nsize, 1); Index: ffs/ffs_balloc.c === RCS file: /cvsroot/src/sys/ufs/ffs/ffs_balloc.c,v retrieving revision 1.63 diff -u -u -r1.63 ffs_balloc.c --- ffs/ffs_balloc.c28 Oct 2017 00:37:13 - 1.63 +++ ffs/ffs_balloc.c10 Apr 2020 22:15:22 - @@ -72,6 +72,12 @@ static int ffs_balloc_ufs2(struct vnode *, off_t, int, kauth_cred_t, int, struct buf **); +static daddr_t +ffs_extb(struct fs *fs, struct ufs2_dinode *dp, daddr_t nb) +{ + return ufs_rw64(dp->di_extb[nb], UFS_FSNEEDSWAP(fs)); +} + /* * Balloc defines the structure of file system storage * by allocating the physical blocks on a device given @@ -139,10 +145,11 @@ osize = ffs_blksize(fs, ip, nb); if (osize < fs->fs_bsize && osize > 0) { mutex_enter(>um_lock); - error = ffs_realloccg(ip, nb, + error = ffs_realloccg(ip, nb, ffs_getdb(fs, ip, nb),