])
])
+#
+# LC_D_OBTAIN_ALIAS
+# starting from 2.6.18 kernel don't export do_kern_mount
+# and want to use vfs_kern_mount instead.
+#
+AC_DEFUN([LC_D_OBTAIN_ALIAS],
+[AC_MSG_CHECKING([d_obtain_alias exist in kernel])
+LB_LINUX_TRY_COMPILE([
+ #include <linux/dcache.h>
+],[
+ d_obtain_alias(NULL);
+],[
+ AC_DEFINE(HAVE_D_OBTAIN_ALIAS, 1,
+ [d_obtain_alias exist in kernel])
+ AC_MSG_RESULT([yes])
+],[
+ AC_MSG_RESULT([no])
+])
+])
+
#
# LC_INVALIDATEPAGE_RETURN_INT
# 2.6.17 changes return type for invalidatepage to 'void' from 'int'
])
])
+# 2.6.29 change prepare/commit_write to write_begin/end
+AC_DEFUN([LC_WRITE_BEGIN_END],
+[AC_MSG_CHECKING([if kernel has .write_begin/end])
+LB_LINUX_TRY_COMPILE([
+ #include <linux/fs.h>
+],[
+ struct address_space_operations aops;
+
+ aops.write_begin = NULL;
+ aops.write_end = NULL;
+], [
+ AC_MSG_RESULT([yes])
+ AC_DEFINE(HAVE_KERNEL_WRITE_BEGIN_END, 1,
+ [kernel has .write_begin/end])
+],[
+ AC_MSG_RESULT([no])
+])
+])
+
+# 2.6.29 blkdev_put has 2 arguments
+AC_DEFUN([LC_BLKDEV_PUT_2ARGS],
+[AC_MSG_CHECKING([blkdev_put needs 2 parameters])
+LB_LINUX_TRY_COMPILE([
+ #include <linux/fs.h>
+],[
+ blkdev_put(NULL, 0);
+],[
+ AC_DEFINE(HAVE_BLKDEV_PUT_2ARGS, 1,
+ [blkdev_put needs 2 paramters])
+ AC_MSG_RESULT([yes])
+],[
+ AC_MSG_RESULT([no])
+])
+])
+
+# 2.6.29 dentry_open has 4 arguments
+AC_DEFUN([LC_DENTRY_OPEN_4ARGS],
+[AC_MSG_CHECKING([dentry_open needs 4 parameters])
+LB_LINUX_TRY_COMPILE([
+ #include <linux/fs.h>
+],[
+ dentry_open(NULL, NULL, 0, NULL);
+],[
+ AC_DEFINE(HAVE_DENTRY_OPEN_4ARGS, 1,
+ [dentry_open needs 4 paramters])
+ AC_MSG_RESULT([yes])
+],[
+ AC_MSG_RESULT([no])
+])
+])
+
#
# LC_PROG_LINUX
#
LC_VFS_SYMLINK_5ARGS
LC_SB_ANY_QUOTA_ACTIVE
LC_SB_HAS_QUOTA_ACTIVE
+
+ #2.6.29
+ LC_WRITE_BEGIN_END
+ LC_D_OBTAIN_ALIAS
+ LC_BLKDEV_PUT_2ARGS
+ LC_DENTRY_OPEN_4ARGS
])
#
#define cfs_current() current
#define cfs_curproc_pid() (current->pid)
#define cfs_curproc_comm() (current->comm)
+#define cfs_curproc_fsuid() (current->fsuid)
+#define cfs_curproc_fsgid() (current->fsgid)
extern struct task_struct *current;
int in_group_p(gid_t gid);
#error sorry, lustre requires at least 2.6.5
#endif
+#include <linux/fs_struct.h>
#include <libcfs/linux/portals_compat25.h>
#include <linux/lustre_patchless_compat.h>
void groups_free(struct group_info *ginfo);
#else /* >= 2.6.4 */
-#define current_ngroups current->group_info->ngroups
-#define current_groups current->group_info->small_block
+#define current_ngroups current_cred()->group_info->ngroups
+#define current_groups current_cred()->group_info->small_block
#endif /* LINUX_VERSION_CODE < KERNEL_VERSION(2,6,4) */
#define to_kdev_t(dev) (dev)
#define kdev_t_to_nr(dev) (dev)
#define val_to_kdev(dev) (dev)
-#define ILOOKUP(sb, ino, test, data) ilookup5(sb, ino, test, data);
+#define ILOOKUP(sb, ino, test, data) ilookup5(sb, ino, test, (void *)(data));
+
+#ifdef HAVE_BLKDEV_PUT_2ARGS
+#define ll_blkdev_put(a, b) blkdev_put(a, b)
+#else
+#define ll_blkdev_put(a, b) blkdev_put(a)
+#endif
+
+#ifdef HAVE_DENTRY_OPEN_4ARGS
+#define ll_dentry_open(a, b, c, d) dentry_open(a, b, c, d)
+#else
+#define ll_dentry_open(a, b, c, d) dentry_open(a, b, c)
+#endif
#include <linux/writeback.h>
#define ll_do_statfs(sb, sfs) (sb)->s_op->statfs((sb), (sfs))
#endif
+#ifndef HAVE_D_OBTAIN_ALIAS
+#define d_obtain_alias(inode) d_alloc_anon(inode)
+#endif
+
#ifdef HAVE_UNREGISTER_BLKDEV_RETURN_INT
#define ll_unregister_blkdev(a,b) unregister_blkdev((a),(b))
#else
#define FIEMAP_FLAG_XATTR 0x00000002 /* map extended attribute tree */
#define FIEMAP_FLAG_DEVICE_ORDER 0x40000000 /* return device ordered mapping */
-#define FIEMAP_FLAGS_COMPAT (FIEMAP_FLAG_SYNC | FIEMAP_FLAG_XATTR | \
- FIEMAP_FLAG_DEVICE_ORDER)
-
-
#define FIEMAP_EXTENT_LAST 0x00000001 /* Last extent in file. */
#define FIEMAP_EXTENT_UNKNOWN 0x00000002 /* Data location unknown. */
#define FIEMAP_EXTENT_DELALLOC 0x00000004 /* Location still pending.
GOTO(out_quotactl, rc = -EPERM);
break;
case Q_GETQUOTA:
- if (((type == USRQUOTA && current->euid != id) ||
+ if (((type == USRQUOTA && cfs_curproc_euid() != id) ||
(type == GRPQUOTA && !in_egroup_p(id))) &&
!cfs_capable(CFS_CAP_SYS_ADMIN))
GOTO(out_quotactl, rc = -EPERM);
/* POSIX: check before ATTR_*TIME_SET set (from inode_change_ok) */
if (ia_valid & (ATTR_MTIME_SET | ATTR_ATIME_SET)) {
- if (current->fsuid != inode->i_uid &&
+ if (cfs_curproc_fsuid() != inode->i_uid &&
!cfs_capable(CFS_CAP_FOWNER))
RETURN(-EPERM);
}
RETURN(ERR_PTR(-ESTALE));
}
- result = d_alloc_anon(inode);
+ result = d_obtain_alias(inode);
if (!result) {
iput(inode);
RETURN(ERR_PTR(-ENOMEM));
return 0;
}
+#ifdef HAVE_BLKDEV_PUT_2ARGS
+static int lo_open(struct block_device *bdev, fmode_t mode)
+{
+ struct lloop_device *lo = bdev->bd_disk->private_data;
+#else
static int lo_open(struct inode *inode, struct file *file)
{
struct lloop_device *lo = inode->i_bdev->bd_disk->private_data;
+#endif
down(&lo->lo_ctl_mutex);
lo->lo_refcnt++;
return 0;
}
+#ifdef HAVE_BLKDEV_PUT_2ARGS
+static int lo_release(struct gendisk *disk, fmode_t mode)
+{
+ struct lloop_device *lo = disk->private_data;
+#else
static int lo_release(struct inode *inode, struct file *file)
{
struct lloop_device *lo = inode->i_bdev->bd_disk->private_data;
+#endif
down(&lo->lo_ctl_mutex);
--lo->lo_refcnt;
}
/* lloop device node's ioctl function. */
+#ifdef HAVE_BLKDEV_PUT_2ARGS
+static int lo_ioctl(struct block_device *bdev, fmode_t mode,
+ unsigned int cmd, unsigned long arg)
+{
+ struct lloop_device *lo = bdev->bd_disk->private_data;
+#else
static int lo_ioctl(struct inode *inode, struct file *unused,
unsigned int cmd, unsigned long arg)
{
struct lloop_device *lo = inode->i_bdev->bd_disk->private_data;
struct block_device *bdev = inode->i_bdev;
+#endif
int err = 0;
down(&lloop_mutex);
case LL_IOC_LLOOP_DETACH: {
err = loop_clr_fd(lo, bdev, 2);
if (err == 0)
- blkdev_put(bdev); /* grabbed in LLOOP_ATTACH */
+ ll_blkdev_put(bdev, 0); /* grabbed in LLOOP_ATTACH */
break;
}
err = loop_set_fd(lo, NULL, bdev, file);
if (err) {
fput(file);
- blkdev_put(bdev);
+ ll_blkdev_put(bdev, 0);
}
break;
bdev = lo->lo_device;
err = loop_clr_fd(lo, bdev, 1);
if (err == 0)
- blkdev_put(bdev); /* grabbed in LLOOP_ATTACH */
+ ll_blkdev_put(bdev, 0); /* grabbed in LLOOP_ATTACH */
break;
}
sbi->ll_stats_track_id == current->parent->pid)
lprocfs_counter_add(sbi->ll_stats, op, count);
else if (sbi->ll_stats_track_type == STATS_TRACK_GID &&
- sbi->ll_stats_track_id == current->gid)
+ sbi->ll_stats_track_id == cfs_curproc_gid())
lprocfs_counter_add(sbi->ll_stats, op, count);
}
EXPORT_SYMBOL(ll_stats_ops_tally);
GOTO(err_exit, err);
err = mdc_create(sbi->ll_mdc_exp, &op_data, tgt, tgt_len,
- mode, current->fsuid, current->fsgid,
+ mode, cfs_curproc_fsuid(), cfs_curproc_fsgid(),
cfs_curproc_cap_pack(), rdev, &request);
if (err)
GOTO(err_exit, err);
return ll_direct_IO(rw, kiocb->ki_filp, iov, file_offset, nr_segs, 1);
}
+#ifdef HAVE_KERNEL_WRITE_BEGIN_END
+static int ll_write_begin(struct file *file, struct address_space *mapping,
+ loff_t pos, unsigned len, unsigned flags,
+ struct page **pagep, void **fsdata)
+{
+ pgoff_t index = pos >> PAGE_CACHE_SHIFT;
+ struct page *page;
+ int rc;
+ unsigned from = pos & (PAGE_CACHE_SIZE - 1);
+ ENTRY;
+
+ page = grab_cache_page_write_begin(mapping, index, flags);
+ if (!page)
+ RETURN(-ENOMEM);
+
+ *pagep = page;
+
+ rc = ll_prepare_write(file, page, from, from + len);
+ if (rc) {
+ unlock_page(page);
+ page_cache_release(page);
+ }
+ RETURN(rc);
+}
+
+static int ll_write_end(struct file *file, struct address_space *mapping,
+ loff_t pos, unsigned len, unsigned copied,
+ struct page *page, void *fsdata)
+{
+ unsigned from = pos & (PAGE_CACHE_SIZE - 1);
+ int rc;
+ rc = ll_commit_write(file, page, from, from + copied);
+
+ unlock_page(page);
+ page_cache_release(page);
+ return rc?rc:copied;
+}
+#endif
+
struct address_space_operations ll_aops = {
.readpage = ll_readpage,
// .readpages = ll_readpages,
.writepages = generic_writepages,
.set_page_dirty = __set_page_dirty_nobuffers,
.sync_page = NULL,
+#ifdef HAVE_KERNEL_WRITE_BEGIN_END
+ .write_begin = ll_write_begin,
+ .write_end = ll_write_end,
+#else
.prepare_write = ll_prepare_write,
.commit_write = ll_commit_write,
+#endif
.invalidatepage = ll_invalidatepage,
.releasepage = ll_releasepage,
.bmap = NULL
current_ngroups = 0;
} else {
#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,4)
+ struct cred *cred;
task_lock(current);
- save->group_info = current->group_info;
- current->group_info = ginfo;
+ save->group_info = current_cred()->group_info;
+ if ((cred = prepare_creds())) {
+ cred->group_info = ginfo;
+ commit_creds(cred);
+ }
task_unlock(current);
#else
LASSERT(ginfo->ngroups <= NGROUPS);
current_ngroups = save->ngroups;
} else {
#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,4)
+ struct cred *cred;
task_lock(current);
- current->group_info = save->group_info;
+ if ((cred = prepare_creds())) {
+ cred->group_info = save->group_info;
+ commit_creds(cred);
+ }
task_unlock(current);
#else
current->ngroups = save->group_info.ngroups;
LASSERT(new_ctx->pwdmnt);
if (uc) {
- save->luc.luc_fsuid = current->fsuid;
- save->luc.luc_fsgid = current->fsgid;
- save->luc.luc_cap = current->cap_effective;
+ struct cred *cred;
+ save->luc.luc_fsuid = current_fsuid();
+ save->luc.luc_fsgid = current_fsgid();
+ save->luc.luc_cap = current_cap();
+
+ if ((cred = prepare_creds())) {
+ cred->fsuid = uc->luc_fsuid;
+ cred->fsgid = uc->luc_fsgid;
+ cred->cap_effective = uc->luc_cap;
+ commit_creds(cred);
+ }
- current->fsuid = uc->luc_fsuid;
- current->fsgid = uc->luc_fsgid;
- current->cap_effective = uc->luc_cap;
push_group_info(save, uc->luc_uce);
}
current->fs->umask = 0; /* umask already applied on client */
mntput(saved->pwdmnt);
current->fs->umask = saved->luc.luc_umask;
if (uc) {
- current->fsuid = saved->luc.luc_fsuid;
- current->fsgid = saved->luc.luc_fsgid;
- current->cap_effective = saved->luc.luc_cap;
+ struct cred *cred;
+ if ((cred = prepare_creds())) {
+ cred->fsuid = saved->luc.luc_fsuid;
+ cred->fsgid = saved->luc.luc_fsgid;
+ cred->cap_effective = saved->luc.luc_cap;
+ commit_creds(cred);
+ }
+
pop_group_info(saved, uc->luc_uce);
}
int flags)
{
mntget(ctxt->pwdmnt);
- return dentry_open(de, ctxt->pwdmnt, flags);
+ return ll_dentry_open(de, ctxt->pwdmnt, flags, current_cred());
}
EXPORT_SYMBOL(l_dentry_open);
b = lustre_msg_buf(req->rq_reqmsg, offset, sizeof(*b));
- b->fsuid = current->fsuid;
- b->fsgid = current->fsgid;
+ b->fsuid = cfs_curproc_fsuid();
+ b->fsgid = cfs_curproc_fsgid();
b->capability = cfs_curproc_cap_pack();
b->fid1 = *fid;
b->size = pg_off; /* !! */
ENTRY;
b = lustre_msg_buf(req->rq_reqmsg, offset, sizeof(*b));
- b->fsuid = current->fsuid;
- b->fsgid = current->fsgid;
+ b->fsuid = cfs_curproc_fsuid();
+ b->fsgid = cfs_curproc_fsgid();
b->capability = cfs_curproc_cap_pack();
if (fid) {
b->valid = valid;
b->eadatasize = ea_size;
b->flags = flags;
- b->fsuid = current->fsuid;
- b->fsgid = current->fsgid;
+ b->fsuid = cfs_curproc_fsuid();
+ b->fsgid = cfs_curproc_fsgid();
b->capability = cfs_curproc_cap_pack();
EXIT;
}
b->valid |= OBD_MD_FLID;
}
- b->fsuid = current->fsuid;
- b->fsgid = current->fsgid;
+ b->fsuid = cfs_curproc_fsuid();
+ b->fsgid = cfs_curproc_fsgid();
b->capability = cfs_curproc_cap_pack();
EXIT;
}
/* XXX do something about time, uid, gid */
rec->cr_opcode = REINT_OPEN;
- rec->cr_fsuid = current->fsuid;
- rec->cr_fsgid = current->fsgid;
+ rec->cr_fsuid = cfs_curproc_fsuid();
+ rec->cr_fsgid = cfs_curproc_fsgid();
rec->cr_cap = cfs_curproc_cap_pack();
rec->cr_fid = op_data->fid1;
memset(&rec->cr_replayfid, 0, sizeof(rec->cr_replayfid));
/* XXX do something about time, uid, gid */
rec->cr_opcode = REINT_OPEN;
- rec->cr_fsuid = current->fsuid;
- rec->cr_fsgid = current->fsgid;
+ rec->cr_fsuid = cfs_curproc_fsuid();
+ rec->cr_fsgid = cfs_curproc_fsgid();
rec->cr_cap = cfs_curproc_cap_pack();
memcpy(&rec->cr_fid1, &op_data->fid1, sizeof(op_data->fid1));
memcpy(&rec->cr_fid2, &op_data->fid2, sizeof(op_data->fid2));
ENTRY;
rec->sa_opcode = REINT_SETATTR;
- rec->sa_fsuid = current->fsuid;
- rec->sa_fsgid = current->fsgid;
+ rec->sa_fsuid = cfs_curproc_fsuid();
+ rec->sa_fsgid = cfs_curproc_fsgid();
rec->sa_cap = cfs_curproc_cap_pack();
rec->sa_fid = data->fid1;
rec->sa_suppgid = -1;
ENTRY;
rec->sa_opcode = REINT_SETATTR;
- rec->sa_fsuid = current->fsuid;
- rec->sa_fsgid = current->fsgid;
+ rec->sa_fsuid = cfs_curproc_fsuid();
+ rec->sa_fsgid = cfs_curproc_fsgid();
rec->sa_cap = cfs_curproc_cap_pack();
memcpy(&rec->sa_fid, &data->fid1, sizeof(data->fid1));
rec->sa_suppgid = -1;
LASSERT (rec != NULL);
rec->ul_opcode = REINT_UNLINK;
- rec->ul_fsuid = current->fsuid;
- rec->ul_fsgid = current->fsgid;
+ rec->ul_fsuid = cfs_curproc_fsuid();
+ rec->ul_fsgid = cfs_curproc_fsgid();
rec->ul_cap = cfs_curproc_cap_pack();
rec->ul_mode = data->create_mode;
rec->ul_suppgid = data->suppgids[0];
LASSERT (rec != NULL);
rec->ul_opcode = REINT_UNLINK;
- rec->ul_fsuid = current->fsuid;
- rec->ul_fsgid = current->fsgid;
+ rec->ul_fsuid = cfs_curproc_fsuid();
+ rec->ul_fsgid = cfs_curproc_fsgid();
rec->ul_cap = cfs_curproc_cap_pack();
rec->ul_mode = data->create_mode;
rec->ul_suppgid1= data->suppgids[0];
rec = lustre_msg_buf(req->rq_reqmsg, offset, sizeof (*rec));
rec->lk_opcode = REINT_LINK;
- rec->lk_fsuid = current->fsuid;
- rec->lk_fsgid = current->fsgid;
+ rec->lk_fsuid = cfs_curproc_fsuid();
+ rec->lk_fsgid = cfs_curproc_fsgid();
rec->lk_cap = cfs_curproc_cap_pack();
rec->lk_suppgid1 = data->suppgids[0];
rec->lk_suppgid2 = data->suppgids[1];
rec = lustre_msg_buf(req->rq_reqmsg, offset, sizeof (*rec));
rec->lk_opcode = REINT_LINK;
- rec->lk_fsuid = current->fsuid;
- rec->lk_fsgid = current->fsgid;
+ rec->lk_fsuid = cfs_curproc_fsuid();
+ rec->lk_fsgid = cfs_curproc_fsgid();
rec->lk_cap = cfs_curproc_cap_pack();
rec->lk_suppgid1 = data->suppgids[0];
rec->lk_suppgid2 = data->suppgids[1];
/* XXX do something about time, uid, gid */
rec->rn_opcode = REINT_RENAME;
- rec->rn_fsuid = current->fsuid;
- rec->rn_fsgid = current->fsgid;
+ rec->rn_fsuid = cfs_curproc_fsuid();
+ rec->rn_fsgid = cfs_curproc_fsgid();
rec->rn_cap = cfs_curproc_cap_pack();
rec->rn_suppgid1 = data->suppgids[0];
rec->rn_suppgid2 = data->suppgids[1];
/* XXX do something about time, uid, gid */
rec->rn_opcode = REINT_RENAME;
- rec->rn_fsuid = current->fsuid;
- rec->rn_fsgid = current->fsgid;
+ rec->rn_fsuid = cfs_curproc_fsuid();
+ rec->rn_fsgid = cfs_curproc_fsgid();
rec->rn_cap = cfs_curproc_cap_pack();
rec->rn_suppgid1 = data->suppgids[0];
rec->rn_suppgid2 = data->suppgids[1];
b = lustre_msg_buf(req->rq_reqmsg, offset, sizeof(*b));
- b->fsuid = current->fsuid;
- b->fsgid = current->fsgid;
+ b->fsuid = cfs_curproc_fsuid();
+ b->fsgid = cfs_curproc_fsgid();
b->capability = cfs_curproc_cap_pack();
b->valid = valid;
b->flags = flags | MDS_BFLAG_EXT_FLAGS;
b = lustre_msg_buf(req->rq_reqmsg, offset, sizeof (*b));
- b->fsuid = current->fsuid;
- b->fsgid = current->fsgid;
+ b->fsuid = cfs_curproc_fsuid();
+ b->fsgid = cfs_curproc_fsgid();
b->capability = cfs_curproc_cap_pack();
b->valid = valid;
b->flags = flags | MDS_BFLAG_EXT_FLAGS;
rec = lustre_msg_buf(req->rq_reqmsg, offset + 1, sizeof(*rec));
rec->sa_opcode = REINT_SETATTR;
- rec->sa_fsuid = current->fsuid;
- rec->sa_fsgid = current->fsgid;
+ rec->sa_fsuid = cfs_curproc_fsuid();
+ rec->sa_fsgid = cfs_curproc_fsgid();
rec->sa_cap = cfs_curproc_cap_pack();
rec->sa_suppgid = -1;
rec = lustre_msg_buf(req->rq_reqmsg, REQ_REC_OFF,
sizeof(struct mdt_rec_setxattr));
rec->sx_opcode = REINT_SETXATTR;
- rec->sx_fsuid = current->fsuid;
- rec->sx_fsgid = current->fsgid;
+ rec->sx_fsuid = cfs_curproc_fsuid();
+ rec->sx_fsgid = cfs_curproc_fsgid();
rec->sx_cap = cfs_curproc_cap_pack();
rec->sx_suppgid1 = -1;
rec->sx_suppgid2 = -1;
int err = 0;
ENTRY;
- if (current->fsuid != 0)
+ if (cfs_curproc_fsuid() != 0)
RETURN(err = -EACCES);
if ((cmd & 0xffffff00) == ((int)'T') << 8) /* ignore all tty ioctls */
RETURN(err = -ENOTTY);
# define list_for_each_safe_rcu list_for_each_safe
# define rcu_read_lock() spin_lock(&bucket->lock)
# define rcu_read_unlock() spin_unlock(&bucket->lock)
+# define list_for_each_entry_rcu list_for_each_entry
#endif /* ifndef HAVE_RCU */
static __u64 handle_base;
void *class_handle2object(__u64 cookie)
{
struct handle_bucket *bucket;
- struct list_head *tmp;
+ struct portals_handle *h;
void *retval = NULL;
ENTRY;
bucket = handle_hash + (cookie & HANDLE_HASH_MASK);
rcu_read_lock();
- list_for_each_rcu(tmp, &bucket->head) {
- struct portals_handle *h;
- h = list_entry(tmp, struct portals_handle, h_link);
+ list_for_each_entry_rcu(h, &bucket->head, h_link) {
if (h->h_cookie != cookie)
continue;
int i;
for (i = 0; i < HANDLE_HASH_SIZE; i++) {
- struct list_head *pos, *n;
- n = NULL;
+ struct portals_handle *h;
spin_lock(&handle_hash[i].lock);
- list_for_each_safe_rcu(pos, n, &(handle_hash[i].head)) {
- struct portals_handle *h;
- h = list_entry(pos, struct portals_handle, h_link);
-
+ list_for_each_entry_rcu(h, &(handle_hash[i].head), h_link) {
CERROR("force clean handle "LPX64" addr %p addref %p\n",
h->h_cookie, h, h->h_addref);