Extended Attributes [take 2]

2020-04-10 Thread Christos Zoulas


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

2020-04-10 Thread Christos Zoulas


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),