Hi Jim,
Jim Law wrote:
Thanks for the place to look. I'm in the 2.4 kernel, and it looks like
emergency_sync() doesn't exist in linux/fs.h there. But I followed your
clue to look in drivers/char/sysrq.c and I see something that looks like
a earlier attempt at a "do_emergency_sync()" in the driver itself. I'll
study this for a while to see if I can figure out how this function gets
registered to be called back by the bdflush kernel thread.
From a quick scan the mechanism looks like this:
include/linux/sysrq.h defines CHECK_EMERGENCY_SYNC which is a small code
fragment to see if the mergency_sync is enabled, and if so vcalls it.
sysrq.c defines the tested variable and the function, as well as some
helpers.
The only place in the kernel I find the CHECK_EMERGENCY_SYNC macro
referenced is in kernel/panic.c, basically during a kernel panic it chekcs
and maybe does a sync.
It seems this fairly generic functionality has been centralised in the 2.6
kernel, but you can lift much of the implementation from the sysrq
handler. Note you'll need to tweak the is_local_disk() function to report
that SystemACE is indeed a block device worthy of syncing, in the kernel
it just does IDE and SCSI drives by the look of it.
Is this
likely to be interrupt-safe in your opinion?
Honestly very hard to say. do_emergency_sync does grab the kernel lock,
not sure what will happen if that occurs during interrupt context.
Give it a try with non-critical stuff on the CF card, see what happens. If
it's not interrupt safe you'll probably get a BUG() or panic() to tell you
so.
Might also be worth floating this past LKML, although not suer how much
help you'll get on a 2.4-era question. uclinux-dev mailing list might
also be worth a try.
Cheers,
John
___________________________
microblaze-uclinux mailing list
microblaze-uclinux@xxxxxxxxxxxxxx
Project Home Page : http://www.itee.uq.edu.au/~jwilliams/mblaze-uclinux
Mailing List Archive :
http://www.itee.uq.edu.au/~listarch/microblaze-uclinux/