Release 4.11 fs/hpfs/buffer.c
/*
* linux/fs/hpfs/buffer.c
*
* Mikulas Patocka (mikulas@artax.karlin.mff.cuni.cz), 1998-1999
*
* general buffer i/o
*/
#include <linux/sched.h>
#include <linux/slab.h>
#include <linux/blkdev.h>
#include "hpfs_fn.h"
secno hpfs_search_hotfix_map(struct super_block *s, secno sec)
{
unsigned i;
struct hpfs_sb_info *sbi = hpfs_sb(s);
for (i = 0; unlikely(i < sbi->n_hotfixes); i++) {
if (sbi->hotfix_from[i] == sec) {
return sbi->hotfix_to[i];
}
}
return sec;
}
Contributors
Person | Tokens | Prop | Commits | CommitProp |
Mikulas Patocka | 70 | 100.00% | 1 | 100.00% |
Total | 70 | 100.00% | 1 | 100.00% |
unsigned hpfs_search_hotfix_map_for_range(struct super_block *s, secno sec, unsigned n)
{
unsigned i;
struct hpfs_sb_info *sbi = hpfs_sb(s);
for (i = 0; unlikely(i < sbi->n_hotfixes); i++) {
if (sbi->hotfix_from[i] >= sec && sbi->hotfix_from[i] < sec + n) {
n = sbi->hotfix_from[i] - sec;
}
}
return n;
}
Contributors
Person | Tokens | Prop | Commits | CommitProp |
Mikulas Patocka | 87 | 100.00% | 1 | 100.00% |
Total | 87 | 100.00% | 1 | 100.00% |
void hpfs_prefetch_sectors(struct super_block *s, unsigned secno, int n)
{
struct buffer_head *bh;
struct blk_plug plug;
if (n <= 0 || unlikely(secno >= hpfs_sb(s)->sb_fs_size))
return;
if (unlikely(hpfs_search_hotfix_map_for_range(s, secno, n) != n))
return;
bh = sb_find_get_block(s, secno);
if (bh) {
if (buffer_uptodate(bh)) {
brelse(bh);
return;
}
brelse(bh);
};
blk_start_plug(&plug);
while (n > 0) {
if (unlikely(secno >= hpfs_sb(s)->sb_fs_size))
break;
sb_breadahead(s, secno);
secno++;
n--;
}
blk_finish_plug(&plug);
}
Contributors
Person | Tokens | Prop | Commits | CommitProp |
Mikulas Patocka | 145 | 100.00% | 2 | 100.00% |
Total | 145 | 100.00% | 2 | 100.00% |
/* Map a sector into a buffer and return pointers to it and to the buffer. */
void *hpfs_map_sector(struct super_block *s, unsigned secno, struct buffer_head **bhp,
int ahead)
{
struct buffer_head *bh;
hpfs_lock_assert(s);
hpfs_prefetch_sectors(s, secno, ahead);
cond_resched();
*bhp = bh = sb_bread(s, hpfs_search_hotfix_map(s, secno));
if (bh != NULL)
return bh->b_data;
else {
pr_err("%s(): read error\n", __func__);
return NULL;
}
}
Contributors
Person | Tokens | Prop | Commits | CommitProp |
Linus Torvalds (pre-git) | 58 | 67.44% | 1 | 12.50% |
Mikulas Patocka | 22 | 25.58% | 4 | 50.00% |
Fabian Frederick | 4 | 4.65% | 2 | 25.00% |
Linus Torvalds | 2 | 2.33% | 1 | 12.50% |
Total | 86 | 100.00% | 8 | 100.00% |
/* Like hpfs_map_sector but don't read anything */
void *hpfs_get_sector(struct super_block *s, unsigned secno, struct buffer_head **bhp)
{
struct buffer_head *bh;
/*return hpfs_map_sector(s, secno, bhp, 0);*/
hpfs_lock_assert(s);
cond_resched();
if ((*bhp = bh = sb_getblk(s, hpfs_search_hotfix_map(s, secno))) != NULL) {
if (!buffer_uptodate(bh)) wait_on_buffer(bh);
set_buffer_uptodate(bh);
return bh->b_data;
} else {
pr_err("%s(): getblk failed\n", __func__);
return NULL;
}
}
Contributors
Person | Tokens | Prop | Commits | CommitProp |
Linus Torvalds (pre-git) | 76 | 80.00% | 2 | 22.22% |
Mikulas Patocka | 13 | 13.68% | 3 | 33.33% |
Fabian Frederick | 4 | 4.21% | 2 | 22.22% |
Linus Torvalds | 1 | 1.05% | 1 | 11.11% |
Andrew Morton | 1 | 1.05% | 1 | 11.11% |
Total | 95 | 100.00% | 9 | 100.00% |
/* Map 4 sectors into a 4buffer and return pointers to it and to the buffer. */
void *hpfs_map_4sectors(struct super_block *s, unsigned secno, struct quad_buffer_head *qbh,
int ahead)
{
char *data;
hpfs_lock_assert(s);
cond_resched();
if (secno & 3) {
pr_err("%s(): unaligned read\n", __func__);
return NULL;
}
hpfs_prefetch_sectors(s, secno, 4 + ahead);
if (!hpfs_map_sector(s, secno + 0, &qbh->bh[0], 0)) goto bail0;
if (!hpfs_map_sector(s, secno + 1, &qbh->bh[1], 0)) goto bail1;
if (!hpfs_map_sector(s, secno + 2, &qbh->bh[2], 0)) goto bail2;
if (!hpfs_map_sector(s, secno + 3, &qbh->bh[3], 0)) goto bail3;
if (likely(qbh->bh[1]->b_data == qbh->bh[0]->b_data + 1 * 512) &&
likely(qbh->bh[2]->b_data == qbh->bh[0]->b_data + 2 * 512) &&
likely(qbh->bh[3]->b_data == qbh->bh[0]->b_data + 3 * 512)) {
return qbh->data = qbh->bh[0]->b_data;
}
qbh->data = data = kmalloc(2048, GFP_NOFS);
if (!data) {
pr_err("%s(): out of memory\n", __func__);
goto bail4;
}
memcpy(data + 0 * 512, qbh->bh[0]->b_data, 512);
memcpy(data + 1 * 512, qbh->bh[1]->b_data, 512);
memcpy(data + 2 * 512, qbh->bh[2]->b_data, 512);
memcpy(data + 3 * 512, qbh->bh[3]->b_data, 512);
return data;
bail4:
brelse(qbh->bh[3]);
bail3:
brelse(qbh->bh[2]);
bail2:
brelse(qbh->bh[1]);
bail1:
brelse(qbh->bh[0]);
bail0:
return NULL;
}
Contributors
Person | Tokens | Prop | Commits | CommitProp |
Mikulas Patocka | 235 | 55.69% | 5 | 55.56% |
Linus Torvalds (pre-git) | 178 | 42.18% | 1 | 11.11% |
Fabian Frederick | 8 | 1.90% | 2 | 22.22% |
Al Viro | 1 | 0.24% | 1 | 11.11% |
Total | 422 | 100.00% | 9 | 100.00% |
/* Don't read sectors */
void *hpfs_get_4sectors(struct super_block *s, unsigned secno,
struct quad_buffer_head *qbh)
{
cond_resched();
hpfs_lock_assert(s);
if (secno & 3) {
pr_err("%s(): unaligned read\n", __func__);
return NULL;
}
if (!hpfs_get_sector(s, secno + 0, &qbh->bh[0])) goto bail0;
if (!hpfs_get_sector(s, secno + 1, &qbh->bh[1])) goto bail1;
if (!hpfs_get_sector(s, secno + 2, &qbh->bh[2])) goto bail2;
if (!hpfs_get_sector(s, secno + 3, &qbh->bh[3])) goto bail3;
if (likely(qbh->bh[1]->b_data == qbh->bh[0]->b_data + 1 * 512) &&
likely(qbh->bh[2]->b_data == qbh->bh[0]->b_data + 2 * 512) &&
likely(qbh->bh[3]->b_data == qbh->bh[0]->b_data + 3 * 512)) {
return qbh->data = qbh->bh[0]->b_data;
}
if (!(qbh->data = kmalloc(2048, GFP_NOFS))) {
pr_err("%s(): out of memory\n", __func__);
goto bail4;
}
return qbh->data;
bail4:
brelse(qbh->bh[3]);
bail3:
brelse(qbh->bh[2]);
bail2:
brelse(qbh->bh[1]);
bail1:
brelse(qbh->bh[0]);
bail0:
return NULL;
}
Contributors
Person | Tokens | Prop | Commits | CommitProp |
Linus Torvalds (pre-git) | 218 | 68.99% | 1 | 14.29% |
Mikulas Patocka | 89 | 28.16% | 3 | 42.86% |
Fabian Frederick | 8 | 2.53% | 2 | 28.57% |
Al Viro | 1 | 0.32% | 1 | 14.29% |
Total | 316 | 100.00% | 7 | 100.00% |
void hpfs_brelse4(struct quad_buffer_head *qbh)
{
if (unlikely(qbh->data != qbh->bh[0]->b_data))
kfree(qbh->data);
brelse(qbh->bh[0]);
brelse(qbh->bh[1]);
brelse(qbh->bh[2]);
brelse(qbh->bh[3]);
}
Contributors
Person | Tokens | Prop | Commits | CommitProp |
Linus Torvalds (pre-git) | 51 | 68.00% | 1 | 50.00% |
Mikulas Patocka | 24 | 32.00% | 1 | 50.00% |
Total | 75 | 100.00% | 2 | 100.00% |
void hpfs_mark_4buffers_dirty(struct quad_buffer_head *qbh)
{
if (unlikely(qbh->data != qbh->bh[0]->b_data)) {
memcpy(qbh->bh[0]->b_data, qbh->data + 0 * 512, 512);
memcpy(qbh->bh[1]->b_data, qbh->data + 1 * 512, 512);
memcpy(qbh->bh[2]->b_data, qbh->data + 2 * 512, 512);
memcpy(qbh->bh[3]->b_data, qbh->data + 3 * 512, 512);
}
mark_buffer_dirty(qbh->bh[0]);
mark_buffer_dirty(qbh->bh[1]);
mark_buffer_dirty(qbh->bh[2]);
mark_buffer_dirty(qbh->bh[3]);
}
Contributors
Person | Tokens | Prop | Commits | CommitProp |
Linus Torvalds (pre-git) | 132 | 83.54% | 1 | 50.00% |
Mikulas Patocka | 26 | 16.46% | 1 | 50.00% |
Total | 158 | 100.00% | 2 | 100.00% |
Overall Contributors
Person | Tokens | Prop | Commits | CommitProp |
Linus Torvalds (pre-git) | 721 | 49.01% | 2 | 14.29% |
Mikulas Patocka | 714 | 48.54% | 5 | 35.71% |
Fabian Frederick | 24 | 1.63% | 2 | 14.29% |
Linus Torvalds | 3 | 0.20% | 1 | 7.14% |
Alexey Dobriyan | 3 | 0.20% | 1 | 7.14% |
Tejun Heo | 3 | 0.20% | 1 | 7.14% |
Al Viro | 2 | 0.14% | 1 | 7.14% |
Andrew Morton | 1 | 0.07% | 1 | 7.14% |
Total | 1471 | 100.00% | 14 | 100.00% |
Information contained on this website is for historical information purposes only and does not indicate or represent copyright ownership.