*/
#include <linux/fs.h>
+#include <linux/quotaops.h>
#include "jfs_incore.h"
#include "jfs_superblock.h"
#include "jfs_filsys.h"
* It's time to move the inline table to an external
* page and begin to build the xtree
*/
- if (dbAlloc(ip, 0, sbi->nbperpage, &xaddr))
+ if (DQUOT_ALLOC_BLOCK(ip, sbi->nbperpage) ||
+ dbAlloc(ip, 0, sbi->nbperpage, &xaddr))
goto clean_up; /* No space */
/*
goto clean_up;
}
ip->i_size = PSIZE;
- ip->i_blocks += LBLK2PBLK(sb, sbi->nbperpage);
if ((mp = get_index_page(ip, 0)) == 0) {
jfs_err("add_index: get_metapage failed!");
goto clean_up;
}
ip->i_size += PSIZE;
- ip->i_blocks += LBLK2PBLK(sb, sbi->nbperpage);
if ((mp = get_index_page(ip, blkno)))
memset(mp->data, 0, PSIZE); /* Just looks better */
n = NDTLEAF_LEGACY(name->namlen);
data.leaf.ip = NULL; /* signifies legacy directory format */
}
- data.leaf.ino = cpu_to_le32(*fsn);
+ data.leaf.ino = *fsn;
/*
* leaf page does not have enough room for new entry:
struct dt_lock *dtlck;
struct tlock *tlck;
struct lv *lv;
+ int quota_allocation = 0;
/* get split page */
smp = split->mp;
split->pxdlist = &pxdlist;
rc = dtSplitRoot(tid, ip, split, &rmp);
- if (!rc)
+ if (rc)
+ dbFree(ip, xaddr, xlen);
+ else
DT_PUTPAGE(rmp);
DT_PUTPAGE(smp);
n = xlen + (xlen << 1);
else
n = xlen;
+
+ /* Allocate blocks to quota. */
+ if (DQUOT_ALLOC_BLOCK(ip, n)) {
+ rc = -EDQUOT;
+ goto extendOut;
+ }
+ quota_allocation += n;
+
if ((rc = dbReAlloc(sbi->ipbmap, xaddr, (s64) xlen,
(s64) n, &nxaddr)))
goto extendOut;
freeKeyName:
kfree(key.name);
+ /* Rollback quota allocation */
+ if (rc && quota_allocation)
+ DQUOT_FREE_BLOCK(ip, quota_allocation);
+
dtSplitUp_Exit:
return rc;
static int dtSplitPage(tid_t tid, struct inode *ip, struct dtsplit * split,
struct metapage ** rmpp, dtpage_t ** rpp, pxd_t * rpxdp)
{
- struct super_block *sb = ip->i_sb;
int rc = 0;
struct metapage *smp;
dtpage_t *sp;
if (rmp == NULL)
return -EIO;
+ /* Allocate blocks to quota. */
+ if (DQUOT_ALLOC_BLOCK(ip, lengthPXD(pxd))) {
+ release_metapage(rmp);
+ return -EDQUOT;
+ }
+
jfs_info("dtSplitPage: ip:0x%p smp:0x%p rmp:0x%p", ip, smp, rmp);
BT_MARK_DIRTY(rmp, ip);
*rmpp = rmp;
*rpxdp = *pxd;
- ip->i_blocks += LBLK2PBLK(sb, lengthPXD(pxd));
-
return rc;
}
tpxd = (pxd_t *) & pp->slot[1];
*tpxd = *pxd;
- /* Since the directory might have an EA and/or ACL associated with it
- * we need to make sure we take that into account when setting the
- * i_nblocks
- */
- ip->i_blocks = LBLK2PBLK(ip->i_sb, xlen +
- ((JFS_IP(ip)->ea.flag & DXD_EXTENT) ?
- lengthDXD(&JFS_IP(ip)->ea) : 0) +
- ((JFS_IP(ip)->acl.flag & DXD_EXTENT) ?
- lengthDXD(&JFS_IP(ip)->acl) : 0));
-
DT_PUTPAGE(pmp);
return 0;
}
rp = rmp->data;
+ /* Allocate blocks to quota. */
+ if (DQUOT_ALLOC_BLOCK(ip, lengthPXD(pxd))) {
+ release_metapage(rmp);
+ return -EDQUOT;
+ }
+
BT_MARK_DIRTY(rmp, ip);
/*
* acquire a transaction lock on the new right page
*rmpp = rmp;
- ip->i_blocks += LBLK2PBLK(ip->i_sb, lengthPXD(pxd));
return 0;
}
}
xlen = lengthPXD(&fp->header.self);
- ip->i_blocks -= LBLK2PBLK(ip->i_sb, xlen);
+
+ /* Free quota allocation. */
+ DQUOT_FREE_BLOCK(ip, xlen);
/* free/invalidate its buffer page */
discard_metapage(fmp);
}
xlen = lengthPXD(&p->header.self);
- ip->i_blocks -= LBLK2PBLK(ip->i_sb, xlen);
+
+ /* Free quota allocation */
+ DQUOT_FREE_BLOCK(ip, xlen);
/* free/invalidate its buffer page */
discard_metapage(mp);
/* init '..' entry */
p->header.idotdot = cpu_to_le32(idotdot);
-#if 0
- ip->i_blocks = LBLK2PBLK(ip->i_sb,
- ((jfs_ip->ea.flag & DXD_EXTENT) ?
- lengthDXD(&jfs_ip->ea) : 0) +
- ((jfs_ip->acl.flag & DXD_EXTENT) ?
- lengthDXD(&jfs_ip->acl) : 0));
-#endif
-
return;
}
dtpage_t * p, /* directory page */
int si)
{ /* entry slot index */
- wchar_t *kname, *name;
+ wchar_t *kname;
+ __le16 *name;
int klen, namlen, len, rc;
struct idtentry *ih;
struct dtslot *t;
int si, /* entry slot index */
int flag)
{
- wchar_t *kname, *name, x;
+ wchar_t *kname, x;
+ __le16 *name;
int klen, namlen, len, rc;
struct ldtentry *lh;
struct idtentry *ih;
struct idtentry *ih;
struct dtslot *t;
int namlen, len;
- wchar_t *name, *kname;
+ wchar_t *kname;
+ __le16 *name;
/* get entry */
stbl = DT_GETSTBL(p);
/*
* move head/only segment
*/
- UniStrncpy_le(kname, name, len);
+ UniStrncpy_from_le(kname, name, len);
/*
* move additional segment(s)
kname += len;
namlen -= len;
len = min(namlen, DTSLOTDATALEN);
- UniStrncpy_le(kname, t->name, len);
+ UniStrncpy_from_le(kname, t->name, len);
si = t->next;
}
struct ldtentry *lh = NULL;
struct idtentry *ih = NULL;
int hsi, fsi, klen, len, nextindex;
- wchar_t *kname, *name;
+ wchar_t *kname;
+ __le16 *name;
s8 *stbl;
pxd_t *xd;
struct dt_lock *dtlck = *dtlock;
if (p->header.flag & BT_LEAF) {
lh = (struct ldtentry *) h;
lh->next = h->next;
- lh->inumber = data->leaf.ino; /* little-endian */
+ lh->inumber = cpu_to_le32(data->leaf.ino);
lh->namlen = klen;
name = lh->name;
if (data->leaf.ip) {
len = min(klen, DTIHDRDATALEN);
}
- UniStrncpy_le(name, kname, len);
+ UniStrncpy_to_le(name, kname, len);
n = 1;
xsi = hsi;
kname += len;
len = min(klen, DTSLOTDATALEN);
- UniStrncpy_le(t->name, kname, len);
+ UniStrncpy_to_le(t->name, kname, len);
n++;
xsi = fsi;
d++;
len = min(snamlen, DTSLOTDATALEN);
- UniStrncpy(d->name, s->name, len);
+ UniStrncpy_le(d->name, s->name, len);
ns++;
nd++;