Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 4 Dec 2014 18:37:42 +0000 (UTC)
From:      Alexander Motin <mav@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r275481 - head/sys/cam/ctl
Message-ID:  <201412041837.sB4Ibgmr069929@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: mav
Date: Thu Dec  4 18:37:42 2014
New Revision: 275481
URL: https://svnweb.freebsd.org/changeset/base/275481

Log:
  Add to CTL support for threshold notifications for file-backed LUNs.
  
  Previously it was supported only for ZVOL-backed LUNs, but now should work
  for file-backed LUNs too.  Used value in this case is a space occupied by
  the backing file, while available value is an available space on file
  system.  Pool thresholds are still not implemented in this case.
  
  MFC after:	2 weeks
  Sponsored by:	iXsystems, Inc.

Modified:
  head/sys/cam/ctl/ctl_backend_block.c

Modified: head/sys/cam/ctl/ctl_backend_block.c
==============================================================================
--- head/sys/cam/ctl/ctl_backend_block.c	Thu Dec  4 18:23:13 2014	(r275480)
+++ head/sys/cam/ctl/ctl_backend_block.c	Thu Dec  4 18:37:42 2014	(r275481)
@@ -242,6 +242,8 @@ static void ctl_be_block_dispatch_file(s
 				       struct ctl_be_block_io *beio);
 static void ctl_be_block_gls_file(struct ctl_be_block_lun *be_lun,
 				  struct ctl_be_block_io *beio);
+static uint64_t ctl_be_block_getattr_file(struct ctl_be_block_lun *be_lun,
+					 const char *attrname);
 static void ctl_be_block_flush_dev(struct ctl_be_block_lun *be_lun,
 				   struct ctl_be_block_io *beio);
 static void ctl_be_block_unmap_dev(struct ctl_be_block_lun *be_lun,
@@ -799,6 +801,31 @@ ctl_be_block_gls_file(struct ctl_be_bloc
 	ctl_complete_beio(beio);
 }
 
+static uint64_t
+ctl_be_block_getattr_file(struct ctl_be_block_lun *be_lun, const char *attrname)
+{
+	struct vattr		vattr;
+	struct statfs		statfs;
+	int			error;
+
+	if (be_lun->vn == NULL)
+		return (UINT64_MAX);
+	if (strcmp(attrname, "blocksused") == 0) {
+		error = VOP_GETATTR(be_lun->vn, &vattr, curthread->td_ucred);
+		if (error != 0)
+			return (UINT64_MAX);
+		return (vattr.va_bytes >> be_lun->blocksize_shift);
+	}
+	if (strcmp(attrname, "blocksavail") == 0) {
+		error = VFS_STATFS(be_lun->vn->v_mount, &statfs);
+		if (error != 0)
+			return (UINT64_MAX);
+		return ((statfs.f_bavail * statfs.f_bsize) >>
+		    be_lun->blocksize_shift);
+	}
+	return (UINT64_MAX);
+}
+
 static void
 ctl_be_block_dispatch_zvol(struct ctl_be_block_lun *be_lun,
 			   struct ctl_be_block_io *beio)
@@ -1724,6 +1751,7 @@ ctl_be_block_open_file(struct ctl_be_blo
 	be_lun->dispatch = ctl_be_block_dispatch_file;
 	be_lun->lun_flush = ctl_be_block_flush_file;
 	be_lun->get_lba_status = ctl_be_block_gls_file;
+	be_lun->getattr = ctl_be_block_getattr_file;
 
 	error = VOP_GETATTR(be_lun->vn, &vattr, curthread->td_ucred);
 	if (error != 0) {



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201412041837.sB4Ibgmr069929>