svn commit: r218602 - head/sys/ufs/ffs
Konstantin Belousov
kib at FreeBSD.org
Sat Feb 12 12:52:13 UTC 2011
Author: kib
Date: Sat Feb 12 12:52:12 2011
New Revision: 218602
URL: http://svn.freebsd.org/changeset/base/218602
Log:
Use the native sector size of the device backing the UFS volume for SU+J
journal blocks, instead of hard coding 512 byte sector size. Journal need
to atomically write the block, that can only be guaranteed at the device
sector size, not larger. Attempt to write less then sector size results in
driver errors.
Note that this is the first structure in UFS that depends on the
sector size. Other elements are written in the units of fragments.
In collaboration with: pho
Reviewed by: jeff
Tested by: bz, pho
Modified:
head/sys/ufs/ffs/ffs_softdep.c
head/sys/ufs/ffs/fs.h
Modified: head/sys/ufs/ffs/ffs_softdep.c
==============================================================================
--- head/sys/ufs/ffs/ffs_softdep.c Sat Feb 12 12:46:00 2011 (r218601)
+++ head/sys/ufs/ffs/ffs_softdep.c Sat Feb 12 12:52:12 2011 (r218602)
@@ -750,7 +750,7 @@ static void handle_written_jnewblk(struc
static void handle_written_jfreeblk(struct jfreeblk *);
static void handle_written_jfreefrag(struct jfreefrag *);
static void complete_jseg(struct jseg *);
-static void jseg_write(struct fs *, struct jblocks *, struct jseg *,
+static void jseg_write(struct ufsmount *ump, struct jblocks *, struct jseg *,
uint8_t *);
static void jaddref_write(struct jaddref *, struct jseg *, uint8_t *);
static void jremref_write(struct jremref *, struct jseg *, uint8_t *);
@@ -2557,8 +2557,8 @@ softdep_prelink(dvp, vp)
}
static void
-jseg_write(fs, jblocks, jseg, data)
- struct fs *fs;
+jseg_write(ump, jblocks, jseg, data)
+ struct ufsmount *ump;
struct jblocks *jblocks;
struct jseg *jseg;
uint8_t *data;
@@ -2569,9 +2569,9 @@ jseg_write(fs, jblocks, jseg, data)
rec->jsr_seq = jseg->js_seq;
rec->jsr_oldest = jblocks->jb_oldestseq;
rec->jsr_cnt = jseg->js_cnt;
- rec->jsr_blocks = jseg->js_size / DEV_BSIZE;
+ rec->jsr_blocks = jseg->js_size / ump->um_devvp->v_bufobj.bo_bsize;
rec->jsr_crc = 0;
- rec->jsr_time = fs->fs_mtime;
+ rec->jsr_time = ump->um_fs->fs_mtime;
}
static inline void
@@ -2721,19 +2721,21 @@ softdep_process_journal(mp, flags)
int size;
int cnt;
int off;
+ int devbsize;
if ((mp->mnt_kern_flag & MNTK_SUJ) == 0)
return;
ump = VFSTOUFS(mp);
fs = ump->um_fs;
jblocks = ump->softdep_jblocks;
+ devbsize = ump->um_devvp->v_bufobj.bo_bsize;
/*
* We write anywhere between a disk block and fs block. The upper
* bound is picked to prevent buffer cache fragmentation and limit
* processing time per I/O.
*/
- jrecmin = (DEV_BSIZE / JREC_SIZE) - 1; /* -1 for seg header */
- jrecmax = (fs->fs_bsize / DEV_BSIZE) * jrecmin;
+ jrecmin = (devbsize / JREC_SIZE) - 1; /* -1 for seg header */
+ jrecmax = (fs->fs_bsize / devbsize) * jrecmin;
segwritten = 0;
while ((cnt = ump->softdep_on_journal) != 0) {
/*
@@ -2788,7 +2790,7 @@ softdep_process_journal(mp, flags)
*/
cnt = ump->softdep_on_journal;
if (cnt < jrecmax)
- size = howmany(cnt, jrecmin) * DEV_BSIZE;
+ size = howmany(cnt, jrecmin) * devbsize;
else
size = fs->fs_bsize;
/*
@@ -2808,7 +2810,7 @@ softdep_process_journal(mp, flags)
* sequence number to it and link it in-order.
*/
cnt = MIN(ump->softdep_on_journal,
- (size / DEV_BSIZE) * jrecmin);
+ (size / devbsize) * jrecmin);
jseg->js_buf = bp;
jseg->js_cnt = cnt;
jseg->js_refs = cnt + 1; /* Self ref. */
@@ -2827,8 +2829,8 @@ softdep_process_journal(mp, flags)
while ((wk = LIST_FIRST(&ump->softdep_journal_pending))
!= NULL) {
/* Place a segment header on every device block. */
- if ((off % DEV_BSIZE) == 0) {
- jseg_write(fs, jblocks, jseg, data);
+ if ((off % devbsize) == 0) {
+ jseg_write(ump, jblocks, jseg, data);
off += JREC_SIZE;
data = bp->b_data + off;
}
Modified: head/sys/ufs/ffs/fs.h
==============================================================================
--- head/sys/ufs/ffs/fs.h Sat Feb 12 12:46:00 2011 (r218601)
+++ head/sys/ufs/ffs/fs.h Sat Feb 12 12:52:12 2011 (r218602)
@@ -682,7 +682,7 @@ struct jsegrec {
uint64_t jsr_seq; /* Our sequence number */
uint64_t jsr_oldest; /* Oldest valid sequence number */
uint16_t jsr_cnt; /* Count of valid records */
- uint16_t jsr_blocks; /* Count of DEV_BSIZE blocks. */
+ uint16_t jsr_blocks; /* Count of device bsize blocks. */
uint32_t jsr_crc; /* 32bit crc of the valid space */
ufs_time_t jsr_time; /* timestamp for mount instance */
};
More information about the svn-src-head
mailing list