PERFORCE change 121937 for review
Scott Long
scottl at FreeBSD.org
Mon Jun 18 22:11:55 UTC 2007
http://perforce.freebsd.org/chv.cgi?CH=121937
Change 121937 by scottl at scottl-deimos on 2007/06/18 22:11:39
Integrate cam_xpt.h
Affected files ...
.. //depot/projects/scottl-camlock/src/sys/cam/cam_xpt.h#11 integrate
.. //depot/user/scottl/ufsj/src/sbin/tunefs/tunefs.c#5 edit
.. //depot/user/scottl/ufsj/src/sys/ufs/ufs/ufs_journal.c#8 edit
Differences ...
==== //depot/projects/scottl-camlock/src/sys/cam/cam_xpt.h#11 (text+ko) ====
@@ -26,7 +26,7 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
- * $FreeBSD: src/sys/cam/cam_xpt.h,v 1.8 2007/04/15 08:49:09 scottl Exp $
+ * $FreeBSD: src/sys/cam/cam_xpt.h,v 1.9 2007/05/16 16:54:23 scottl Exp $
*/
#ifndef _CAM_CAM_XPT_H
@@ -80,6 +80,8 @@
void xpt_rescan(union ccb *ccb);
void xpt_lock_buses(void);
void xpt_unlock_buses(void);
+cam_status xpt_register_async(int event, ac_callback_t *cbfunc,
+ void *cbarg, struct cam_path *path);
cam_status xpt_compile_path(struct cam_path *new_path,
struct cam_periph *perph,
path_id_t path_id,
==== //depot/user/scottl/ufsj/src/sbin/tunefs/tunefs.c#5 (text+ko) ====
@@ -76,6 +76,7 @@
void usage(void);
void printfs(void);
int create_journal(struct fs *, const char *dev);
+daddr_t get_free_block(struct fs *, int *);
int
main(int argc, char *argv[])
@@ -442,53 +443,69 @@
int
create_journal(struct fs *fs, const char *dev)
{
- struct ufsj_superblock jsb;
- struct ufs_args args;
- struct stat jstat;
- char jbuf;
- int j, error;
+ struct ufsj_superblock *jsb;
+ daddr_t jblock, blkno;
+ uint32_t bavail, maxjblocks, jblocks;
+ int lastcg;
if ((fs->fs_flags & FS_UNCLEAN) || (fs->fs_clean == 0)) {
warnx("%s filesystem not clean", dev);
return (-1);
}
- bzero(&args, sizeof(args));
- args.fspec = (char *)dev;
- if (mount("ufs", "/mnt", 0, &args) < 0) {
- warnx("Could not mount %s: %d", dev, error);
- return (error);
+ /*
+ * Calculate the journal size
+ */
+ bavail = freespace(fs, fs->fs_minfree);
+ maxjblocks = (fs->fs_bsize - (sizeof(struct ufsj_superblock) +
+ sizeof(daddr_t) / sizeof(daddr_t))) / sizeof(daddr_t);
+ jblocks = MIN(bavail * (1 - fs->fs_minfree), maxjblocks);
+ printf("bavail= %d, maxjblocks= %d, jblocks= %d\n", bavail, maxjblocks,
+ jblocks);
+
+ /*
+ * Allocate the journal superblock
+ */
+ jsb = malloc(fs->fs_bsize);
+ if (jsb == NULL) {
+ warnx("Cannot allocate memory for journal\n");
+ return (-1);
}
- j = open("/mnt/.ffsjournal", O_CREAT|O_TRUNC|O_RDWR, 0600);
- if (j < 0) {
- warnx("Could not open journal file: %d", errno);
- return (errno);
+ /*
+ * Allocate a block for the journal superblock to reside in.
+ */
+ lastcg = 0;
+ jblock = get_free_block(fs, &lastcg);
+ if (jblock == 0) {
+ free(jsb);
+ warnx("Cannot allocate journal superblock on %s\n", dev);
+ return (-1);
}
- bzero(&jsb, sizeof(struct ufsj_superblock));
- jsb.j_magic = UFSJ_MAGIC;
- jsb.j_fsmagic = fs->fs_magic;
- jsb.j_flags = J_ENABLED;
- write(j, &jsb, sizeof(struct ufsj_superblock));
- if (lseek(j, 1024 * 1024 - 1, SEEK_SET) < 0) {
- warnx("Could not seek journal file: %d", errno);
- close(j);
- unlink("/mnt/.ffsjournal");
- return (EIO);
- }
- jbuf = 0;
- write(j, &jbuf, 1);
- close(j);
- bzero(&jstat, sizeof(struct stat));
- if (stat("/mnt/.ffsjournal", &jstat) != 0) {
- warnx("Could not stat journal file: %d", errno);
- unlink("/mnt/.ffsjournal");
- return (EIO);
- }
- fs->fs_journal_inode = jstat.st_ino;
- fs->fs_flags |= FS_JOURNAL;
- unmount("/mnt", 0);
+
return (0);
}
+daddr_t
+get_free_block(struct fs *fs, int *lastcg)
+{
+#if 0
+ struct cg *cg;
+ daddr_t fbbaddr;
+ int i, error;
+
+ for (i = *lastcg; i < fs->fs_ncg; i++) {
+ if ((error = cgread1(&disk, i)) < 0) {
+ warnx("Error %d reading cg %d\n", error, i);
+ return (0);
+ }
+ cg = &disk.d_cg;
+ fbbaddr = cg->cg_freeoff + cgstart(fs, i);
+ printf("Reading free block bitmap for cg %d at %ld\n", i, fbbaddr);
+ break;
+ }
+#endif
+ printf("CGSIZE= %d\n", CGSIZE(fs));
+ return (0);
+}
==== //depot/user/scottl/ufsj/src/sys/ufs/ufs/ufs_journal.c#8 (text+ko) ====
@@ -124,12 +124,20 @@
printf("Checking journal superblock\n");
jsb = (struct ufsj_superblock *)jbp->b_data;
- if ((jsb->j_magic != UFSJ_MAGIC) || (jsb->j_fsmagic != fs->fs_magic) ||
- ((jsb->j_flags & J_ENABLED) == 0)) {
- error = 0; /* XXX Does this really warrant an error? */
+ if ((jsb->j_magic != UFSJ_MAGIC) || (jsb->j_fsmagic != fs->fs_magic)) {
+ printf("v_usecount= %d\n", jvp->v_usecount);
+ printf("Bad journal magic\n");
+ printf("0x%x 0x%x 0x%x 0x%x\n", jsb->j_magic, UFSJ_MAGIC, jsb->j_fsmagic, fs->fs_magic);
+ error = EINVAL;
goto out;
}
+ printf("v_usecount= %d\n", jvp->v_usecount);
+ if ((jsb->j_flags & J_ENABLED) == 0) {
+ printf("Journal is not enabled\n");
+ error = 0;
+ goto out;
+ }
journal->gen = jsb->j_gen;
journal->start = jsb->j_start;
journal->len = jsb->j_len;
@@ -143,7 +151,9 @@
ump->um_journal = journal;
flags = jsb->j_flags;
jvp->v_vflag |= VV_SYSTEM;
+ printf("v_usecount= %d\n", jvp->v_usecount);
brelse(jbp);
+ printf("v_usecount= %d\n", jvp->v_usecount);
jbp = NULL;
mtx_init(&journal->jmtx, "jmtx", "Journal lock", MTX_DEF);
@@ -161,12 +171,19 @@
printf("Journal started\n");
mp->mnt_flag |= MNT_JOURNAL;
+ printf("v_usecount= %d\n", jvp->v_usecount);
return (0);
out:
- if (jbp != NULL)
+ printf("v_usecount= %d\n", jvp->v_usecount);
+ if (jbp != NULL) {
+ printf("releasing jbp\n");
brelse(jbp);
+ }
+ printf("releasing vnode ref\n");
+ printf("v_usecount= %d\n", jvp->v_usecount);
vrele(jvp);
+ printf("v_usecount= %d\n", jvp->v_usecount);
free(journal, M_UFSMNT);
return (error);
}
@@ -182,24 +199,28 @@
struct vnode *jvp;
int error, jflags;
+ printf("ufsj_stop: called\n");
+ if ((mp->mnt_flag | MNT_JOURNAL) != 0)
+ return (0);
ump = VFSTOUFS(mp);
- journal = ump->um_journal;
+ if ((journal = ump->um_journal) == NULL)
+ return (0);
jflags = 0;
jvp = journal->jvp;
+ jbp = NULL;
ufsj_flush(journal);
if (journal->head != 0 && journal->tail != 0) {
jflags = J_DIRTY;
printf("Warning, journal not flushed\n");
- }
-
- if ((error = VFS_VGET(mp, journal->fs->fs_journal_inode, LK_NOWAIT |
- LK_EXCLUSIVE, &jvp)) != 0) {
+ vput(jvp);
+ error = EIO;
goto out;
}
printf("ufsj_stop: reading jsb\n");
+ VOP_LOCK(jvp, LK_EXCLUSIVE|LK_RETRY, td);
if ((error = bread(jvp, journal->jsb_off, JSBLOCKSIZE,
NOCRED, &jbp)) == 0) {
jsb = (struct ufsj_superblock *)jbp->b_data;
@@ -211,11 +232,11 @@
if ((error = bwrite(jbp)) != 0)
printf("Error %d writing journal superblock!\n", error);
} else {
- printf("ufsj_stop: read of sb failed\n");
+ printf("ufsj_stop: read of sb failed: %d\n", error);
brelse(jbp);
}
- vn_close(jvp, FREAD|FWRITE, td->td_ucred, td);
+ vput(jvp);
vflush(mp, 0, flags, td);
out:
@@ -323,6 +344,7 @@
static int
ufsj_replay(struct ufs_journal *journal)
{
+ printf("ufsj_replay\n");
return (0);
}
More information about the p4-projects
mailing list